父访问Python中的子类中定义的类变量?

时间:2015-07-30 20:44:40

标签: python oop inheritance

我在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__()

2 个答案:

答案 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的实例。