我在python中学习OOP,我很惊讶在另一个post中发现父类可以访问在child中定义的类变量,如下例所示。我可以理解child可以访问继承的父bc中定义的类变量(或者它不是继承而是其他东西?)。是什么让这成为可能,它是否暗示了一个类变量池,当它继承自超类时,子类可以添加(和它的超类可以访问)?
class Parent(object):
def __init__(self):
for attr in self.ATTRS: // accessing class variable defined in child?
setattr(self, attr, 0)
class Child(Parent):
#class variable
ATTRS = ['attr1', 'attr2', 'attr3']
def __init__(self):
super(Child, self).__init__()
答案 0 :(得分:3)
这个例子有点扭曲。父类的定义不完整,它引用了不存在的类变量,只有在实例化类或对其进行子类化时才会变得明显。
如果你的子类如下:
class Child2(Parent):
def __init__(self):
super(Child2, self).__init__()
然后实例化子类将无效:
Traceback (most recent call last):
File "./cl.py", line 25, in <module>
y=Child2()
File "./cl.py", line 20, in __init__
super(Child2, self).__init__()
File "./cl.py", line 6, in __init__
for attr in self.ATTRS:
AttributeError: 'Child2' object has no attribute 'ATTRS'
您必须按照以下方式修复您的父级才能使其正常工作:
class Parent(object):
ATTRS = None
def __init__(self):
if self.ATTRS:
for attr in self.ATTRS:
setattr(self, attr, 0)
它在原始示例中起作用的原因是Python是一种解释型语言,因此代码仅在运行时进行评估。
答案 1 :(得分:1)
父级未访问类变量,因为self
中的__init__(self)
是Child
的实例。