对于python来说,其并没有像C#、Java那样使用关键字的形式对变量进行访问控制
而是使用 左至少两个下划线,右至多一个下划线的形式(__kwargs)表明一个变量是私有变量
第一种场景,没有使用私有变量,结果与预期有出入,结果输出 b 3
而在我们的预期中,子类传入两个kwargs,子类的init函数对kwargs分组,再调用父类的init函数,实际应该将两个kwargs都输出,但实际只输出了b 3
这是因为子类的valid_kws和父类的vaild_kws都是同一个对象("b"),子类的left_kwargs实际是{'a': 2},再调用父类的init函数时,valid_kws = ["b"],而kwargs是{'a': 2}
class ParentClass:
valid_kwds = ["a"]
def __init__(self, **kwargs):
for k, v in kwargs.items():
if k in self.valid_kwds:
print(k, v)
class ChildClass(ParentClass):
valid_kwds = ["b"]
def __init__(self, **kwargs):
left_kwargs = {}
for k, v in kwargs.items():
if k in self.valid_kwds:
print(k, v)
else:
left_kwargs[k] = v
super().__init__(**left_kwargs)
if __name__ == '__main__':
child = ChildClass(a=2, b=3)
第二种场景,将valid_kwds私有化,结果符合预期
class ParentClass:
__valid_kwds = ["a"]
def __init__(self, **kwargs):
for k, v in kwargs.items():
if k in self.__valid_kwds:
print(k, v)
class ChildClass(ParentClass):
__valid_kwds = ["b"]
def __init__(self, **kwargs):
left_kwargs = {}
for k, v in kwargs.items():
if k in self.__valid_kwds:
print(k, v)
else:
left_kwargs[k] = v
super().__init__(**left_kwargs)
if __name__ == '__main__':
child = ChildClass(a=2, b=3)
标签:__,kwds,python,self,私有,init,valid,kwargs,属性
From: https://www.cnblogs.com/zero17/p/17421986.html