2016-08-25 4 views
1

Может ли кто-нибудь дать подробное объяснение, почему это происходит? Как компилятор 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? 

ответ

5

Поскольку переменные класса оцениваются одновременно, оценивается сам класс. При этом последовательность событий: A определяется и значение в нем установлены, так x 1 и y равен 2. Тогда B определяются и x записи в B установлена ​​на 10. Затем вы получаете доступ B.y, и с тех пор нет записи y в B, она проверяет свой родительский класс. Он находит запись y в A со значением 2. y определяется только один раз.

Если вы действительно хотите такую ​​переменную, вы можете определить метод класса.

class A: 
    x = 1 

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

class B(A): 
    x = 10 

>>> B.y() 
11 
+0

В коде OP нет таких отношений. – TigerhawkT3

+1

Это было ясно, что имелось в виду, хотя это было отмечено как «наследование». – spruceb

+0

Оба 'A' ​​и' B' наследуют от 'object'. – TigerhawkT3

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

Я подозреваю, что OP должен был написать 'class B (A)'. – Blender

+0

Почему downvote? Это демонстрирует, что 'A' и' B' не разделяют переменные, даже если они оба наследуются от одного и того же родительского класса. – TigerhawkT3

+0

ОП обновил свой вопрос. – chepner

1

Это потому, что y является атрибутом класса, который принадлежит А, так что изменение величины х в классе экземпляра B не изменяет значение y. Вы можете узнать больше об этом в документации: https://docs.python.org/2/tutorial/classes.html#class-objects

+0

В частности, значение 'y' фиксируется с использованием значения' x' в момент его определения. – chepner

Смежные вопросы