Um eine Klassenvariable in Python zu definieren, müssen Sie die Variable unter dem Klassennamen deklarieren. Das steht in der offiziellen Dokumentation.
https://docs.python.jp/3/tutorial/classes.html#class-and-instance-variables
sample.py
class Sample:
name = 'name'
s = Sample()
s2 = Sample()
print(s.name) # 'name'
print(s2.name) # 'name'
Offensichtlich werden beide als "Name" angezeigt.
Wenn Sie den Namen jedoch so ändern, handelt es sich nicht mehr um eine Klassenvariable.
sample.py
s = Sample()
s2 = Sample()
s.name = 'aaaa'
print(s.name) # 'aaaa'
print(s2.name) # 'name'
Wenn Sie dies tun, wird s.name
als aaaa und s2.name
als name angezeigt. Wenn es von allen Objekten gemeinsam genutzt wird, sollte sich s2.name ebenfalls in "aaaa" ändern.
Die Antwort lautet, dass Zeichenfolgen unveränderlich sind. Wenn Sie also über ein Objekt auf sie verweisen, werden automatisch Instanzvariablen erstellt.
Aber als ich Sample.name
ausprobierte, änderten sich beide zu aaaa. Es hat Eigenschaften als Klassenvariable. Wird es durch Lesen der Luft interpretiert, je nachdem, ob die Referenzquelle eine Klasse oder ein Objekt ist?
Arrays und Wörterbuchtypen sind veränderbar, daher werden die Änderungen im Folgenden weitergegeben und beide Ausdrucke werden als "[1,2,3,4]" angezeigt. Es ist natürlich, weil es auf dasselbe hinweist.
sample.py
class Sample:
a_list = [1,2,3]
s = Sample()
s2 = Sample()
s.a_list.append(4)
print(s.a_list) # [1,2,3,4]
print(s2.a_list) # [1,2,3,4]
Ich frage mich, ob es in Ordnung ist zu sagen, dass selbst wenn Sie eine unveränderliche Klasse deklarieren, diese automatisch zu einer Instanzvariablen wechselt und die veränderbare Variable eine Klassenvariable bleibt. Im Prinzip werde ich es teilen. Unveränderliche Daten werden jedoch zu Instanzvariablen, wenn über Objekte zugegriffen wird.
Ich frage mich, ob es eine solche Spezifikation ist.
Recommended Posts