0
votes

Le dictionnaire à l'intérieur de la classe python est traité comme un objet statique?

J'ai un objet de stockage de données simple qui utilise un dictionnaire. Lorsque je crée deux instances de cet objet, il semble que le dictionnaire du magasin soit traité comme une variable statique et que le deuxième objet écrase le premier. Cependant, la variable de valeur de la classe n'est pas statique. Voici un exemple de code simple:

> 5680:Dimmer 100
> 5681:ON/OFF True

Voici ce que j'obtiens:

class Obj():
    value = None

    def __init__(self, id, name, value=None):
        self.store = {}
        self.store["Id"] = id
        self.store["Name"] = name
        self.value = value

Mais si je change où je définis mon dictionnaire de magasin la méthode __init__ , ça marche:

> 5681:ON/OFF 100
> 5681:ON/OFF True

Et le résultat est le suivant:

class Obj():
    store = {}
    value = None

    def __init__(self, id, name, value=None):
        self.store["Id"] = id
        self.store["Name"] = name
        self.value = value

    def __getitem__(self, item):
        return self.store[item]

    def __str__(self):
        return f'{self["Id"]}:{self["Name"]} {self.value}'

obj1 = Obj(5680, "Dimmer", 100)
obj2 = Obj(5681, "ON/OFF", True)

print(obj1)
print(obj2)

Je ne comprends pas pourquoi, dans mon premier exemple, il traite le dictionnaire du magasin comme «statique».

OK - Il semble que mon attribut de magasin soit un 'attribut de classe' - REF: https://www.toptal.com/python/python-class-attributes-an-overly-thorough-guide

Cependant, mon l'attribut value est traité comme un 'attribut d'instance' car une valeur non mutable lui est assignée (None / Integer etc)


1 commentaires

Débarrassez-vous des déclarations de variables de classe store = {} et value = None . Vous les déclarez dans le constructeur, c'est assez bien.


3 Réponses :


1
votes

Parce que dans votre premier exemple, les variables sont des attributs de classe, elles sont donc communes à toute la classe et non à l'instance.

Cet article l'explique très bien https: / /www.toptal.com/python/python-class-attributes-an-overly-thorough-guide

Meilleures salutations


0 commentaires

2
votes

Ici, vous avez:

class Obj():
    value = None # class-level variable

    def __init__(self, value=None):
        self.value = value # object-level variable

Par conséquent, vous avez:

  • Obj.value , qui est une variable au niveau de la classe (commune à toutes les instances Obj )
  • obj.value , qui est une variable de niveau objet de obj , où obj est une instance de type Obj


0 commentaires

1
votes

en python toute variables qui sont attribuées une valeur dans la déclaration de classe sont statiques Alors que toutes les variables qui sont attribuées des valeurs à l'intérieur des méthodes de classe sont des variables d'instance.

voir ici pour plus d'informations détail.


0 commentaires