关于oop:父级访问在python的子级中定义的类变量?

Parent accessing class variable defined in child in Python?

我正在学习Python中的OOP,我很惊讶在另一篇文章中发现父类可以访问子类中定义的类变量,如下面的示例。我可以理解子类可以访问继承的父BC中定义的类变量(或者它不是继承而是其他什么东西?).什么使这成为可能?它是否意味着当子类从超类继承时,子类可以添加(及其超类可以访问)的类变量池?

1
2
3
4
5
6
7
8
9
10
11
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__()


这个例子有点扭曲。父类的定义不完整,它引用了不存在的类变量,这些变量只有在实例化类或子类时才会变得明显。

如果您的子类如下:

1
2
3
class Child2(Parent):
    def __init__(self):
        super(Child2, self).__init__()

那么实例化子类就不起作用了:

1
2
3
4
5
6
7
8
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'

您必须按以下方式修复您的家长才能使其正常工作:

1
2
3
4
5
6
class Parent(object):
    ATTRS = None
    def __init__(self):
        if self.ATTRS:
            for attr in self.ATTRS:
                setattr(self, attr, 0)

它在原始示例中工作的原因是,Python是一种解释语言,因此代码只在运行时进行计算。


父级不访问类变量,因为__init__(self)中的selfChild的实例。