继承类属性?

时间:2016-08-25 00:15:51

标签: python inheritance

有人能提供详细解释为何会发生这种情况吗?在这种情况下,Python编译器如何创建类变量?

class A(object):
    x = 1
    y = x + 1

class B(A):
    x = 10

>>> B.x
10
>>> B.y
2  # ---> I was expecting 11 here, why does this y still uses the A's value?

3 个答案:

答案 0 :(得分:5)

因为类变量是在评估类本身的同时进行的。此处的事件序列为:A已定义且其中的值已设置,因此x为1且y为2.然后定义B,并且x中的B条目设置为10.然后您访问B.y,并且由于y中没有B条目,它会检查其父类。它确实在y中找到A条目,其值为2y只定义一次。

如果你真的想要这样一个变量,你可能想要定义一个类方法。

class A:
    x = 1

    @classmethod
    def y(cls):
        return cls.x + 1

class B(A):
    x = 10

>>> B.y()
11

答案 1 :(得分:1)

这是因为y是属于A的类属性,因此在B的类实例中更改x的值不会更改y的值。您可以在文档中了解更多相关信息:https://docs.python.org/2/tutorial/classes.html#class-objects

答案 2 :(得分:-1)

它没有那样做。

>>> class A(object):
...     x = 1
...     y = x + 1
...
>>> class B(object):
...     x = 10
...
>>> B.x
10
>>> B.y
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: type object 'B' has no attribute 'y'