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?
3 Answers 3
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 B.y, 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
3 Comments
inheritance.A and B inherit from object.B did not inherit from A, but based on the context of the question it was clearly meant to.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
1 Comment
y is fixed using the value of x at the time it is defined.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'
2 Comments
class B(A).A and B do not share variables even though they both inherit from the same parent class.