Introduction aux propriétés publiques des classes

巴扎黑
Libérer: 2017-07-17 15:58:06
original
1534 Les gens l'ont consulté

1. Concept

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.

2. Attributs

2.1 Attributs des membres

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')
Copier après la connexion
print(p1.job, p2.job)

# 输出
Doctor Police
Copier après la connexion

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.

2.2 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(p1.nationality)
print(p2.nationality)

# 输出

CN
CN
Copier après la connexion

Pour les attributs publics, la valeur obtenue par tous les objets d'instance y accédant est Même.

 

3. Caractéristiques des attributs publics

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
Copier après la connexion

 

3.1 Appel d'instance unique et modification des propriétés publiques

# 依据上例

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)


# 输出
Copier après la connexion

--------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
Copier après la connexion

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'
Copier après la connexion

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
Copier après la connexion

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!