instance.name
Wenn Sie eine Klassenvariable aufrufen, rufen Sie sie mit * instance * .name auf. Es gibt zwei Arten von Callees.
name
class foo:
name1 = 'test1'
def __init__(self):
self.name2 = 'test2'
bar = foo()
print(bar.name1)
# => test1
print(bar.name2)
# => test2
Die Werte dieser beiden können auf die gleiche Weise geändert werden.
bar.name1 = 'huga'
bar.name2 = 'hogehoge'
print(bar.name1)
# => huga
print(bar.name2)
# => hogehoeg
Das Verhalten ändert sich jedoch wie folgt.
print(bar.__class__.name1)
# => test1
print(bar.__class__.name2)
# => AttributeError
Was ist die Ursache dafür? Tatsächlich gibt es zwei Arten von Variablen, die eine Klasse hat. Eine ist eine gewöhnliche Klassenvariable. Die andere ist eine dict-Variable, die als Basismitglied der Klasse vorhanden ist.
name
class foo:
name1 = 'test1'
def __init__(self):
self.name2 = 'test2'
bar = foo()
print(bar.__dict__)
# => {'name2':'test2'}
bar.name1 = 'hoge'
print(bar.__dict__)
# => {'name2':'test2','name1':'hoge'}
Aufrufe wie * instance * .name zeigen vorzugsweise \ _ \ _dict \ _ \ _ [name] an. Rufen Sie \ _ \ _ class \ _ \ _ auf. Name nur, wenn \ _ \ _dict \ _ \ _ [Name] nicht vorhanden ist.
Wenn Sie eine Klassenvariable als Anfangswert oder als unveränderten Wert verwenden möchten, sollten Sie sie schreiben, ohne self zu verwenden. Wie name1. Wenn Sie immer mit dem in der Klasse angegebenen Wert verarbeiten möchten, sollten Sie ihn als self.class.name aufrufen. Ein weiterer Vorteil des Schreibens wie name1 besteht darin, dass es auf den Anfangswert zurückgesetzt werden kann.
name
class foo:
name1 = 'test1'
def __init__(self):
self.name2 = 'test2'
bar = foo()
print(bar.name1)
# => test1
bar.name1 = 'newname'
print(bar.name1)
# => newname
del bar.name1
print(bar.name1)
# => test1
Sie können self.name nur deklarieren, wenn Sie erwarten, dass es sich ändert, oder wenn Sie sich den Wert vor der Änderung nicht merken müssen.
Recommended Posts