Variables de classe et d'instance Python

Pour définir une variable de classe en Python, vous êtes censé déclarer la variable sous le nom de classe. C'est ce que dit la documentation officielle.

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'

De toute évidence, les deux sont affichés comme "nom".

Cependant, si vous changez le nom de cette manière, ce ne sera plus une variable de classe.

sample.py


   s  = Sample()
   s2 = Sample()
   
   s.name = 'aaaa' 
   
   print(s.name) # 'aaaa'
   print(s2.name) # 'name'

Lorsque vous faites cela, «s.name» est affiché comme aaaa et «s2.name» est affiché comme nom. S'il est partagé par tous les objets, s2.name devrait également devenir ʻaaaa`.

La réponse est que les chaînes sont immuables, donc si vous y faites référence via un objet, elles créeront automatiquement des variables d'instance.

Mais quand j'ai essayé Sample.name, les deux ont changé en aaaa. Il a des caractéristiques en tant que variable de classe. S'interprète-t-il en lisant l'air selon que la source de référence est une classe ou un objet?

Les tableaux et les types de dictionnaire sont modifiables, donc faire ce qui suit propage les changements et les deux impressions s'affichent sous la forme «[1,2,3,4]». C'est naturel parce que cela indique la même chose.

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]

Résumer de force

Je me demande s'il est correct de dire que même si vous déclarez un immuable sous une classe, il basculera automatiquement vers une variable d'instance, et le mutable reste une variable de classe. En principe, je vais le partager. Mais les données immuables deviennent des variables d'instance lorsqu'elles sont accédées via des objets.

Je me demande si c'est une telle spécification.

Recommended Posts

Python: variables de classe et d'instance
Variables de classe et d'instance Python
classe python, instance
À propos de la classe et de l'instance
Ordre de référence des variables de classe et des variables d'instance dans "self. Variables de classe" en Python
J'étais accro aux variables de classe et aux variables d'instance erronées en Python
[python] Différence entre variable et self. Variable dans la classe
Problème avec les variables pseudo-privées Python et l'héritage de classe
À propos des variables et des objets Python
Globalisation des variables d'instance de classe
Variables Python et ID d'objet
Variable de classe
[Python] Variables
Variable de classe
Utilisation correcte de la méthode d'instance et de la méthode de classe
objet perl et classe python partie 2.
objet perl et classe python partie 1.
[Python] Hériter d'une classe avec des variables de classe
Classes et instances Python, méthodes d'instance
[Python] Comment jouer avec les variables de classe avec décorateur et métaclasse
"Kanrika" la classe python
Exemple d'utilisation de variables de classe et de méthodes de classe
[Python] Différence entre la méthode de classe et la méthode statique
[python] Obtenir une liste de variables d'instance
Python est une instance
Je suis mort en pensant qu'une variable de classe Python était une variable d'instance
Les bases de #Python (classe)
Parler des attributs de classe Python et des métaclasses
Variables Python et types de données appris avec la chimio-automatique
J'ai écrit une classe en Python3 et Java
Python: préparez un sérialiseur pour l'instance de classe:
[Python] Chapitre 02-01 Bases des programmes Python (opérations et variables)
[Python] Comment trier les instances par variables d'instance
[Python] Type de classe et utilisation du module datetime
[python] Compresser et décompresser
classe wrapper python syslog
Variables de numérotation des mémorandums Python
Astuces Python et Numpy
Variables globales et locales 2
[Python] pip et roue
classe de cas en python
Itérateur et générateur Python
[Python] Héritage de classe (super)
Tri par classe Python
[python] méthode de base de la classe
Paquets et modules Python
Intégration Vue-Cli et Python
Ruby, Python et carte
[Python] Héritage de classe, remplacement
entrée et sortie python
Python et Ruby se séparent
classe de wrapper de sous-processus python
Métaclasse et isinstance
Classes et méthodes statiques
Python asyncio et ContextVar
Classe wrapper YOLO Python
Notation de classe en Python