Sie könnten hier die terminology "Klassenvariable" und "Instanzvariable" verwenden, da dies die übliche Sprache in Python ist.
class Foo(object):
var1 = "I'm a class variable"
def __init__(self, var2):
self.var2 = var2 # var2 is an instance variable
Die einzige Scoping-Regel, die Sie wirklich brauchen, in Python wissen, ist die Suchreihenfolge für Namen - „LEGB“, für lokale, Enclosing, Globale und Builtin.
Die Klassenbereichsvariable var1
muss immer noch nach "get attribute" gesucht werden, Sie können nur auf diese durch Foo.var1
oder self.var1
zugreifen. Natürlich können Sie auch anderswo innerhalb des Klassendefinitionsblocks darauf zugreifen, aber das ist nur eine Beispielverwendung aus dem Bereich "Lokal". Wenn Sie self.var1
sehen, können Sie nicht sofort wissen, ob es sich um eine Instanz oder eine Klassenvariable handelt (und auch nicht, wenn der Name überhaupt an ein Objekt gebunden ist!). Sie wissen nur, dass das get-Attribut auf dem Objekt selbst versucht wird, bevor es in der Klasse versucht wird.
der Tat kann eine Instanzvariable eine Klassenvariable mit dem gleichen Namen Schatten:
>>> f1 = Foo(var2='f1_2')
>>> f2 = Foo(var2='f2_2')
>>> f2.var1
"I'm a class variable"
>>> f2.var1 = "Boom!" # this shadows the class variable
>>> f1.var1, Foo.var1, f2.var1 # but: the class variable still exists
("I'm a class variable", "I'm a class variable", 'Boom!')
>>> del f2.var1 # restores the name resolution on the Foo object
>>> f2.var1
"I'm a class variable"
Angelegenheiten erschweren, können wir Phantasie Code schreiben, die Klassenvariablen verhalten sich eher wie Instanzvariablen macht; Ein bemerkenswertes Beispiel sind "Felder" eines ORM. In Django können Sie beispielsweise ein Integer-Feld für die Klasse model definieren. Wenn Sie jedoch diesen Namen für eine Instanz des Modells suchen, wird eine tatsächliche Ganzzahl zurückgegeben (kein IntegerField
-Objekt).
Wenn Sie an dieser fortgeschrittenen Verwendung von Attributzugriff interessiert sind, lesen Sie die descriptor protocol.Für alltägliche Klassen können Sie diese Details ignorieren, aber es ist wert zu wissen, dass die übliche Auflösung von Instanzvariablen und Klassenvariablen niedrigere Priorität als alle Deskriptoren, die möglicherweise für die Klasse definiert wurden.
Im Allgemeinen können Sie nicht sagen. Aber das ist auch nicht relevant. – Daniel
Sie könnten nach ["9.3.5. Klassen- und Instanzvariablen"] (https://docs.python.org/2/tutorial/classes.html#class-and-instance-variables) suchen, was die meisten davon abdeckt was du fragst. –
Wie können Sie feststellen, in welchem Kontext? Programmgesteuert prüfen? Quellcode ansehen? –