Obwohl die akzeptierte Antwort genau richtig ist, möchte ich eine kleine Beschreibung hinzufügen.
Machen wir eine kleine Übung
Definieren Sie zunächst eine Klasse wie folgt:
class A:
temp = 'Skyharbor'
def __init__(self, x):
self.x = x
def change(self, y):
self.temp = y
Was haben wir hier?
- Wir haben eine sehr einfache Klasse, die ein Attribut hat,
tempdas eine Zeichenfolge ist
- Eine
__init__Methode, die setztself.x
- Eine Änderungsmethode wird festgelegt
self.temp
Bis jetzt ziemlich einfach, ja? Jetzt fangen wir an, mit dieser Klasse herumzuspielen. Initialisieren wir zuerst diese Klasse:
a = A('Tesseract')
Gehen Sie nun wie folgt vor:
>>> print(a.temp)
Skyharbor
>>> print(A.temp)
Skyharbor
Nun, a.temphat wie erwartet funktioniert, aber wie zum Teufel hat es A.tempfunktioniert? Nun, es hat funktioniert, weil Temp ein Klassenattribut ist. Alles in Python ist ein Objekt. Hier ist A auch ein Objekt der Klasse type. Daher ist das Attribut temp ein Attribut, das von der AKlasse gehalten wird. Wenn Sie den Wert von temp durch A(und nicht durch eine Instanz von a) ändern, wird der geänderte Wert in der gesamten Instanz der AKlasse wiedergegeben. Lassen Sie uns fortfahren und das tun:
>>> A.temp = 'Monuments'
>>> print(A.temp)
Monuments
>>> print(a.temp)
Monuments
Interessant, nicht wahr? Und beachten Sie, dass id(a.temp)und id(A.temp)sind immer noch die gleichen .
Jedes Python-Objekt erhält automatisch ein __dict__Attribut, das die Liste der Attribute enthält. Lassen Sie uns untersuchen, was dieses Wörterbuch für unsere Beispielobjekte enthält:
>>> print(A.__dict__)
{
'change': <function change at 0x7f5e26fee6e0>,
'__module__': '__main__',
'__init__': <function __init__ at 0x7f5e26fee668>,
'temp': 'Monuments',
'__doc__': None
}
>>> print(a.__dict__)
{x: 'Tesseract'}
Beachten Sie, dass das tempAttribut unter Aden Attributen der Klasse aufgeführt ist, während xes für die Instanz aufgeführt ist.
Wie kommt es, dass wir einen definierten Wert erhalten , a.tempwenn es nicht einmal für die Instanz aufgeführt wird a. Nun, das ist die Magie von__getattribute__() Methode. In Python ruft die gepunktete Syntax diese Methode automatisch auf, sodass a.tempPython beim Schreiben ausgeführt wird a.__getattribute__('temp'). Diese Methode führt die Attributsuchaktion aus, dh sie ermittelt den Wert des Attributs, indem sie an verschiedenen Stellen sucht.
Die Standardimplementierung der __getattribute__()Suche durchsucht zunächst das interne Wörterbuch ( dikt ) eines Objekts und dann der Typ des Objekts selbst . In diesem Fall a.__getattribute__('temp')wird zuerst a.__dict__['temp']und dann ausgeführta.__class__.__dict__['temp']
Okay, jetzt lass uns unsere benutzen change Methode:
>>> a.change('Intervals')
>>> print(a.temp)
Intervals
>>> print(A.temp)
Monuments
Nun, da wir verwendet haben self , print(a.temp)gibt uns einen anderen Wert als print(A.temp).
Wenn wir nun id(a.temp)und vergleichen id(A.temp), werden sie unterschiedlich sein.
listals Attributname verwenden.listist eine integrierte Funktion zum Erstellen einer neuen Liste. Sie sollten Namensklassen mit Großbuchstaben schreiben.