2016-08-25 2 views
1

Kann jemand eine detaillierte Erklärung geben, warum dies geschieht? Wie erstellt der Python-Compiler in diesem Fall Klassenvariablen?Vererbung von Klassenattributen?

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? 

Antwort

5

Da Klassenvariablen gleichzeitig ausgewertet werden, wird die Klasse selbst ausgewertet. Hier ist die Abfolge der Ereignisse ist: A definiert ist und die Werte in es gesetzt, so x 1 und y ist 2. Dann B definiert ist, und der x Eintrag in B wird auf 10. Dann greifen Sie B.y, und seit Es gibt keinen y Eintrag in B, es überprüft seine Elternklasse. Es findet einen y Eintrag in A mit einem Wert von 2. y ist nur einmal definiert.

Wenn Sie eine solche Variable wirklich wollen, können Sie eine Klassenmethode definieren.

class A: 
    x = 1 

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

class B(A): 
    x = 10 

>>> B.y() 
11 
+0

Es gibt keine solche Beziehung im OP-Code. – TigerhawkT3

+1

Das war klar, was gemeint war, aber es wurde mit "Vererbung" markiert. – spruceb

+0

Sowohl "A" als auch "B" erben von "Objekt". – TigerhawkT3

-1

Es tut das nicht.

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

Ich vermute, dass OP bedeutete, Klasse B (A) zu schreiben. – Blender

+0

Warum der Downvote? Dies zeigt, dass 'A' und' B' keine Variablen gemeinsam haben, obwohl sie beide von derselben Elternklasse erben. – TigerhawkT3

+0

Das OP hat ihre Frage aktualisiert. – chepner

1

Dies liegt daran, y ein Klassenattribut ist, das zu A gehört, so den Wert von x in einer Klasseninstanz Ändern von B nicht den Wert von y ändern. Sie können mehr darüber in der Dokumentation lesen: https://docs.python.org/2/tutorial/classes.html#class-objects

+0

Insbesondere wird der Wert von "y" festgelegt, indem der Wert von "x" zum Zeitpunkt der Definition verwendet wird. – chepner

Verwandte Themen