[Python] Hériter d'une classe avec des variables de classe

S'il y a plusieurs classes qui héritent de la classe parente qui a des variables de classe Notez que le comportement lorsque la classe enfant accède à la variable de classe était suspect.

Conclusion (?):

Symptômes

#Classe parent
class AbstClass:
    class_number = 0
    dict_number = {'class': 0}

#Classe enfant 1
class Class1(AbstClass):
    def __init__(self):
        self.class_number = 1
        self.dict_number['class'] = 1

#Classe enfant 2
class Class2(AbstClass):
    def __init__(self):
        self.class_number = 2
        self.dict_number['class'] = 2

obj1 = Class1()
print(obj1.class_number, obj1.dict_number['class']) # 1,1 ← Comprendre
obj2 = Class2()
print(obj2.class_number, obj2.dict_number['class']) # 2,2 ← Comprendre
print(obj1.class_number, obj1.dict_number['class']) # 1, 2 ←!?

Il est facile de comprendre si "deux classes enfants accèdent aux variables de classe de la même classe parent", Dans l'exemple ci-dessus

--class_number est géré séparément par deux classes --dict_number est partagé par deux classes → Écrase dict_numer réécrit dans Class1 lorsque Class2 () est exécuté

Il est devenu.

Hypothèse de cause

Est-ce que mutable / immuable est impliqué? J'imagine. En d'autres termes

En fait, si vous définissez un taple de class_number_tuple = (0,) dans AbstClass, Le même comportement que class_number a été confirmé. (* Int est immuable. Référence: [GAMMASOFT: table de classification des types de données intégrée à Python (mutable, etc.)] (https://gammasoft.jp/blog/python-built-in-types/))

Contre-mesures

Redéfinissez les variables de classe dans les classes enfants:

class Class1(AbstClass):
    class_number = 0
    dict_kv = {'class': 0}

class Class2(AbstClass):
    class_number = 0
    dict_kv = {'class': 0}

Et, dans chaque cas, les variables de classe de chaque classe sont hiérarchisées = elles sont gérées séparément.

Cependant, si vous le souhaitez, je souhaite que vous leviez automatiquement une exception en tant que langue.

――En fait, quand je mets une liste dans la clé du dictionnaire, je me fâche avec unhashable --S'il est possible de spécifier des "variables de classe à partager" et "des variables de classe à écraser par des classes enfants" comme @ abstractmethod de ABC ...

En tant que mesure courante,

S'agit-il de ... Je vous serais reconnaissant si vous pouviez me dire de bonnes mesures.

Recommended Posts

[Python] Hériter d'une classe avec des variables de classe
Créer un décorateur de fonction Python avec Class
[Note] Créez une classe de fuseau horaire sur une ligne avec python
Problème avec les variables pseudo-privées Python et l'héritage de classe
Python: variables de classe et d'instance
Variables de classe et d'instance Python
Faites une loterie avec Python
Créer un répertoire avec python
Résoudre ABC163 A ~ C avec Python
Faites fonctionner l'imprimante de reçus avec python
Manuel de graphisme Python avec Matplotlib.
Les mines terrestres cachées dans les variables de classe Python
Faisons une interface graphique avec python.
Résoudre ABC166 A ~ D avec Python
Variable de classe
Créez un environnement virtuel avec Python!
J'ai fait une loterie avec Python.
[Python] Variables
Créer un environnement virtuel avec Python 3
Résoudre ABC168 A ~ C avec Python
Variable de classe
[Python] Générer un mot de passe avec Slackbot
Résoudre ABC162 A ~ C avec Python
Résoudre ABC167 A ~ C avec Python
Résoudre ABC158 A ~ C avec Python
Faisons un graphe avec python! !!
J'ai créé un démon avec Python
Ecrire un script batch avec Python3.5 ~
[Road to Intermediate Python] Appelez une instance de classe comme une fonction avec __call__
[Pyenv] Construire un environnement python avec ubuntu 16.04
Générer une collection de première classe en Python
Livre en spirale en Python! Python avec un livre en spirale! (Chapitre 14 ~)
Créer un fichier power simple avec Python
[Python] Un programme qui crée des escaliers avec #
Faisons un jeu de shiritori avec Python
Installer Python en tant que Framework avec pyenv
[Python] Comment rendre une classe itérable
J'ai fait un compteur de caractères avec Python
[Python] Dessiner un motif de tourbillon avec une tortue
J'ai dessiné une carte thermique avec Seaborn [Python]
[Python] Créez un environnement virtuel avec Anaconda
Créons un groupe gratuit avec Python
Un mémo contenant Python2.7 et Python3 dans CentOS
Création d'un environnement Python 3.6 avec Windows + PowerShell
Carte des informations de location sur une carte avec python
Rechercher le labyrinthe avec l'algorithme python A *
Classe Trump en Python (avec comparaison)
Faisons la voix lentement avec Python
Créé un voyage de fléchettes avec python (news)
[Python] Une application web rapide avec Bottle!
[AtCoder] Résoudre ABC1 ~ 100 Un problème avec Python
Ecrire un client TCP avec Python Twisted
Ce que j'ai fait avec les tableaux Python
Résoudre AtCoder ABC168 avec python (A ~ D)
Créer un compteur de fréquence de mots avec Python 3.4
Essayez le scraping HTML avec la bibliothèque Python
J'ai fait une carte hexadécimale avec Python