【问题标题】:Parent accessing class variable defined in child in Python?父访问Python中子定义的类变量?
【发布时间】:2015-07-30 20:44:39
【问题描述】:

我正在学习 Python 中的 OOP,我惊讶地发现在另一个 post 中,父类可以访问子类中定义的类变量,如下例所示。我可以理解 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__()

【问题讨论】:

  • 您正在使用self 访问这些变量。 selfChild 而不是 Parent 的直接实例,因此它可以访问这些内容。这就是属性查找的工作原理。
  • self 在你指的父类?
  • @Pippi self 在两个地方都是 same 实例 - 它是您用来实例化它的任何类的实例(从类生成的对象)(@在这种情况下为 987654331@)。从Child 来看,它本身就是一个实例。从Parent 来看,它是其子类之一的实例。
  • @Pippi 这样想:self 总是意味着“我自己的一个实例或我的超类或子类” - 所以是的,父类上的方法可以可以访问其子类的实例成员(属性或方法)。我推荐 Raymond Hettinger 关于这个话题的演讲 Python's Class Development Toolkit
  • (他在34m38s处理这个具体案例)

标签: python oop inheritance


【解决方案1】:

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

如果你的子类如下:

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 是一种解释型语言,因此代码仅在运行时进行评估。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • self 在你指的父类?
    猜你喜欢
    • 2022-10-24
    • 2011-04-08
    • 1970-01-01
    • 2012-06-04
    • 1970-01-01
    • 1970-01-01
    • 2018-08-15
    • 1970-01-01
    相关资源
    最近更新 更多