Attribut de classe python
j'ai une question à propos de l'attribut de classe en python.
class base :
def __init__ (self):
pass
derived_val = 1
t1 = base()
t2 = base ()
t2.derived_val +=1
t2.__class__.derived_val +=2
print t2.derived_val # its value is 2
print t2.__class__.derived_val # its value is 3
Les résultats sont différents. J'utilise également la fonction id() pour trouver des t2.derived_val et t2.classe.derived_val ont de la mémoire différente de l'adresse.
Mon problème est derived_val est un attribut de classe. Pourquoi c'est différent dans l'exemple ci-dessus?
Est-ce parce que l'instance de classe de copier ses propres derived_val à côté de l'attribut de classe?
source d'informationauteur chnet
Vous devez vous connecter pour publier un commentaire.
Il y a des attributs de classe, et l'instance attributs.
Quand vous dites
De la définition d'un attribut de classe.
derived_val
devient une clé dansbase.__dict__
.Quand vous dites
t2.derived_val
Python essaie de trouver les "derived_val" danst2.__dict__
. Car il n'est pas là, il regarde si il y a un'derived_val'
clé det2
's des classes de base.Mais lorsque vous affectez une valeur à
t2.derived_val
vous êtes maintenant l'ajout d'une instance de l'attributt2
. Underived_val
clé est ajoutée àt2.__dict__
.Notez qu'à ce stade, il y a deux
derived_val
attributs, mais seulementl'instance de l'attribut est facilement accessible. L'attribut de classe devient accessible uniquement par le biais de référencement
base.derived_val
ou d'un accès direct à la classe dictbase.__dict__
.Vérifier ici et ici.
La
__class__
attribut de la classe à laquelle l'objet appartient. Donc dans votre exemple, la situation est similaire pour les variables statiques. Let2.__class__.derived_val
fait référence à la variable qui appartient à la classe, pas la variable qui appartient à t2.D'une autre façon (peut-être plus concis) pour démontrer ceci: