简体   繁体   中英

Inheritance of class attributes?

Can someone provides a detail explanation why this is happening? How does Python compiler create class variables in this case?

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?

Because class variables are evaluated at the same time the class itself is evaluated. Here the sequence of events is: A is defined and the values in it are set, so x is 1 and y is 2. Then B is defined, and the x entry in B is set to 10. Then you access By , and since there is no y entry in B , it checks its parent class. It does find a y entry in A , with a value of 2 . y is defined only once.

If you really want such a variable, you may want to define a class method.

class A:
    x = 1

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

class B(A):
    x = 10

>>> B.y()
11

This is because y is a class attribute that belongs to A, so changing the value of x in a class instance of B does not change the value of y . You can read more about that in the documentation: https://docs.python.org/2/tutorial/classes.html#class-objects

It does not do that.

>>> 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'

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM