Maison >développement back-end >Tutoriel Python >Introduction aux propriétés publiques des classes
Nous avons évoqué plus haut les attributs privés d'une classe, qui sont ceux auxquels on ne peut pas accéder directement dans la classe. Mais que se passe-t-il si les propriétés directement accessibles sont des propriétés publiques ? Pas vraiment. Les propriétés du constructeur __init__() sont fondamentalement accessibles au monde extérieur, mais ce ne sont pas des propriétés publiques. Alors, que sont les attributs publics ?
Définition : Désigne les propriétés accessibles par tous les objets appartenant à cette classe, appelées propriétés publiques.
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
Nous sommes ici Deux objets sont définis sous la classe Person, p1 et p2. Évidemment, nous n'avons aucun moyen pour p1 d'accéder à l'attribut job de p2, c'est-à-dire Police. Ensuite, les attributs tels que self.name dans le constructeur __init__() sont appelés attributs membres.
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
Pour les attributs publics, la valeur obtenue par tous les objets d'instance y accédant est Même.
Nous pouvons non seulement accéder, mais aussi modifier les attributs publics.
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) # 输出
--------Avant le changement---------
CN
CN
CN
--------après le changement------ ---
US
JP
US
On peut très bien comprendre p1 avant de le modifier, car tout le monde appelle l'attribut public nationalité de la classe Personne, donc p1, Le les attributs de nationalité de p2 sont les mêmes, les deux sont « CN ». Mais pourquoi l'attribut nationalité de p2 n'a-t-il pas changé après que p1 ait modifié l'attribut public ?
Lorsque nous définissons une classe Person, elle existe déjà dans la mémoire, bien sûr. contient également les propriétés publiques de cette classe. Lorsque l'instance initiale p1 appelle l'attribut nationalité de la classe Personne, elle fait directement référence à l'adresse mémoire de nationalité dans la classe au lieu d'ajouter un nouvel attribut appelé nationalité.
Comme indiqué ci-dessous :
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
Cela peut expliquer pourquoi lorsque la nationalité dans la classe Personne est modifiée en « US », p2 change également. Parce qu'il fait directement référence à la valeur en mémoire.
p1.nationality = 'JP'
Après que p1 ait directement attribué l'attribut de nationalité, l'instance p1 s'ajoute en fait une nouvelle variable membre, appelée nationalité. C'est juste que leurs noms sont les mêmes, mais il n'y a aucun lien entre les deux, et même les adresses mémoire sont différentes.
# 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
Donc p1.nationality='JP' ne modifie pas les attributs publics de la classe Person, mais crée un nouvel attribut membre pour lui-même, donc le changement de p1 est Public les propriétés de la classe n'ont aucun effet.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!