variables de classe python et variables d'instance

(*-*)浩
Libérer: 2019-10-31 10:56:26
original
4147 Les gens l'ont consulté

Nous savons que quels que soient les attributs ou les méthodes définis dans la classe, ils ne peuvent pas être directement appelés en dehors de la classe. Par conséquent, nous pouvons complètement considérer la classe comme une portée indépendante (appelée espace de noms de classe), alors les attributs de classe sont. en fait des variables définies dans l'espace de noms de classe (les méthodes de classe sont en fait des fonctions définies dans l'espace de noms de classe).

variables de classe python et variables d'instance

Selon l'emplacement où l'attribut est défini, les attributs de classe peuvent être subdivisés en attributs de classe (représentés ultérieurement par des variables de classe) et en attributs d'instance (représentés ultérieurement par des variables d'instance) .

Variables de classe (attributs de classe) (Apprentissage recommandé : Tutoriel vidéo Python)

Les variables de classe font référence à celles définies dans la classe, mais dans Variables en dehors de chaque méthode de classe. La caractéristique des variables de classe est que tous les objets instanciés d'une classe peuvent partager la valeur de la variable de classe, c'est-à-dire que les variables de classe peuvent être utilisées comme ressources publiques dans tous les objets instanciés.

Notez qu'il est recommandé d'accéder directement aux variables de classe à l'aide des noms de classe, mais elles sont également accessibles à l'aide des noms d'objet.

Par exemple, le code suivant définit une classe Address et plusieurs attributs de classe pour la classe :

class Address :
    detail = '广州'
    post_code = '510660'
    def info (self):
        # 尝试直接访问类变量
        #print(detail) # 报错
        # 通过类来访问类变量
        print(Address.detail) # 输出 广州
        print(Address.post_code) # 输出 510660
#创建 2 个类对象
addr1 = Address()
addr1.info()
addr2 = Address()
addr2.info()
# 修改Address类的类变量
Address.detail = '佛山'
Address.post_code = '460110'
addr1.info()
addr2.info()
Copier après la connexion

Dans ce programme, les deuxième et troisième lignes de code définissent deux variables de classe. Lorsque la méthode info() de l'objet Address est appelée pour la première fois dans le programme pour générer deux variables de classe, les valeurs initiales des deux variables de classe seront affichées. Ensuite, le programme modifie les valeurs des deux variables de classe via la classe Address. Ainsi, lorsque le programme génère les deux variables de classe via la méthode info() pour la deuxième fois, les valeurs modifiées des deux variables de classe seront être émis.

Exécutez le code ci-dessus et vous verrez le résultat suivant :

广州
510660
广州
510660
佛山
460110
佛山
460110
Copier après la connexion

Comme vous pouvez le voir sur le résultat, addr1 et addr2 partagent des variables de classe. En d'autres termes, changer la valeur de la classe. La variable fonctionnera pour tous les objets instanciés de cette classe.

Les variables d'instance font référence à des attributs définis dans les méthodes d'une classe. Sa particularité est qu'elles n'agissent que sur l'objet qui appelle la méthode.

Notez que les variables d'instance ne sont accessibles que via les noms d'objet et ne sont pas accessibles directement via les noms de classe.

Python permet d'accéder aux variables de classe via des objets, mais la valeur des variables de classe ne peut pas être modifiée via des objets. Car modifier la valeur d'une variable de classe via un objet, ce n'est pas "attribuer une valeur à la variable de classe", mais définir une nouvelle variable d'instance.

Par exemple, le programme suivant :

class Inventory:
    # 定义两个类变量
    item = '鼠标'
    quantity = 2000
    # 定义实例方法
    def change(self, item, quantity):
        # 下面赋值语句不是对类变量赋值,而是定义新的实例变量
        self.item = item
        self.quantity = quantity
# 创建Inventory对象
iv = Inventory()
iv.change('显示器', 500)
# 访问iv的item和quantity实例变量
print(iv.item) # 显示器
print(iv.quantity) # 500
# 访问Inventory的item和quantity类变量
print(Inventory.item) # 鼠标
print(Inventory.quantity) # 2000
Copier après la connexion

Dans le programme ci-dessus, les 8ème et 9ème lignes de code attribuent des valeurs aux variables d'article et de quantité à travers des exemples , qui ressemble beaucoup aux affectations de variables de classe, mais ce n'est pas le cas, ce qu'ils font est de redéfinir deux variables d'instance.

Dans une classe, les variables d'instance et les variables de classe peuvent avoir le même nom, mais dans ce cas, l'utilisation de l'objet classe ne pourra pas appeler la variable de classe car elle préférera la variable d'instance, c'est donc également déconseillé pour la raison "variables de classe utilisant l'appel de nom d'objet".

Après avoir appelé la méthode change() de l'objet Inventory, le programme ci-dessus accède aux variables d'article et de quantité de l'objet Inventory. Puisque l'objet lui-même possède ces deux variables d'instance, le programme affichera les variables d'instance de. la valeur de l'objet ; ensuite, le programme accède à ses variables de classe d'article et de quantité via l'inventaire. À ce moment, les variables de classe sont réellement accessibles.

Exécutez le programme ci-dessus et vous verrez le résultat suivant :

显示器
500
鼠标
2000
Copier après la connexion

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!