Wir haben bereits die privaten Attribute einer Klasse erwähnt, auf die nicht direkt in der Klasse zugegriffen werden kann. Was aber, wenn Eigenschaften, auf die direkt zugegriffen werden kann, öffentliche Eigenschaften sind? Nicht wirklich. Die Eigenschaften im __init__()-Konstruktor sind grundsätzlich für die Außenwelt zugänglich, sie sind jedoch keine öffentlichen Eigenschaften. Was sind also öffentliche Attribute?
Definition: Bezieht sich auf Eigenschaften, auf die alle zu dieser Klasse gehörenden Objekte zugreifen können, sogenannte öffentliche Eigenschaften.
class Person(object): def __init__(self, name, job, phone, address): self.name = name # 成员属性,属于某个实例对象 self.job = job self.phone = phone self.__address = address def get_private(self): return self.__address def sayhi(self): print("hell,%s" % self.name) p1 = Person('Bigberg', 'Doctor', '8833421', 'hz') p2 = Person('Ashlex', 'Police', '8833232', 'bj')
print(p1.job, p2.job) # 输出 Doctor Police
Wir sind Hier sind zwei Objekte unter der Person-Klasse definiert, p1 und p2. Offensichtlich haben wir für p1 keine Möglichkeit, auf das Jobattribut von p2, also Police, zuzugreifen. Dann werden Attribute wie self.name im Konstruktor __init__() als Mitgliedsattribute bezeichnet.
class Person(object): nationality = 'CN' # 定义公有属性 def __init__(self, name, job, phone, address): self.name = name self.job = job self.phone = phone self.address = address def sayhi(self): print("hell,%s" % self.name) p1 = Person('Bigberg', 'Doctor', '8833421', 'hz') p2 = Person('Ashlex', 'Police', '8833232', 'bj') print(p1.nationality) print(p2.nationality) # 输出 CN CN
Bei öffentlichen Attributen handelt es sich um den Wert, den alle darauf zugreifenden Instanzobjekte erhalten Dasselbe.
Wir können nicht nur auf öffentliche Attribute zugreifen, sondern diese auch ändern.
class Person(object): nationality = 'CN' # 定义公有属性 def __init__(self, name, job, phone, address): self.name = name self.job = job self.phone = phone self.address = address def sayhi(self): print("hell,%s" % self.name) p1 = Person('Bigberg', 'Doctor', '8833421', 'hz') p2 = Person('Ashlex', 'Police', '8833232', 'bj') print(Person.nationality) # 调用 公有属性 Person.nationality = 'us' # 改变 公有属性 print(Person.nationality) #输出 CN us
# 依据上例 print("--------Befoer change---------") print(Person.nationality) print(p1.nationality) print(p2.nationality) print("--------after change---------") print(Person.nationality) p1.nationality = 'JP' print(p1.nationality) print(p2.nationality) # 输出
--------Vor der Änderung---------
CN
CN
CN
--------nach der Änderung------ ---
US
JP
US
Wir können p1 sehr gut verstehen, bevor wir es ändern, da jeder das öffentliche Attribut Nationalität der Klasse Person nennt, also p1, The Die Nationalitätsattribute von p2 sind gleich, beide sind „CN“. Aber warum hat sich das Nationalitätsattribut von p2 nicht geändert, nachdem p1 das öffentliche Attribut geändert hat? enthält auch die öffentlichen Eigenschaften dieser Klasse. Wenn die anfängliche Instanz p1 das Nationalitätsattribut der Klasse Person aufruft, verweist sie direkt auf die Speicheradresse der Nationalität in der Klasse, anstatt ein neues Attribut namens Nationalität hinzuzufügen.
Wie unten gezeigt:
Dies kann erklären, warum sich auch p2 ändert, wenn die Nationalität in der Personenklasse in „US“ geändert wird. Weil es direkt auf den Wert im Speicher verweist.
print(id(Person.nationality)) print(id(p1.nationality)) print(id(p2.nationality)) print(Person.nationality, p1.nationality, p2.nationality) #输出 1751236836128 1751236836128 1751236836128 CN CN CN
Nachdem p1 das Nationalitätsattribut direkt zugewiesen hat, fügt Instanz p1 tatsächlich eine neue Mitgliedsvariable namens Nationalität zu sich selbst hinzu. Es ist nur so, dass ihre Namen gleich sind, aber es gibt keinen Zusammenhang zwischen den beiden und sogar die Speicheradressen sind unterschiedlich.
p1.nationality = 'JP'
p1.nationality='JP' ändert also nicht die öffentlichen Attribute der Person-Klasse, sondern erstellt ein neues Mitgliedsattribut für sich selbst, sodass die Änderung von p1 öffentlich ist Eigenschaften der Klasse haben keine Auswirkung.
# p1.nationality = 'JP' print(id(Person.nationality)) print(id(p1.nationality)) print(id(p2.nationality)) print(Person.nationality, p1.nationality, p2.nationality) #输出 2434579585096 2434579585152 2434579585096 US JP US
Das obige ist der detaillierte Inhalt vonEinführung in öffentliche Eigenschaften von Klassen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!