instance.name
Lors de l'appel d'une variable de classe, appelez-la avec * instance * .name, Il existe deux types de callees.
name
class foo:
name1 = 'test1'
def __init__(self):
self.name2 = 'test2'
bar = foo()
print(bar.name1)
# => test1
print(bar.name2)
# => test2
Les valeurs de ces deux peuvent être modifiées de la même manière.
bar.name1 = 'huga'
bar.name2 = 'hogehoge'
print(bar.name1)
# => huga
print(bar.name2)
# => hogehoeg
Cependant, le comportement change comme suit.
print(bar.__class__.name1)
# => test1
print(bar.__class__.name2)
# => AttributeError
Quelle est la cause de cela? En fait, il existe deux types de variables qu'une classe possède. L'une est une variable de classe ordinaire. L'autre est une variable dict qui existe en tant que membre de base de la classe.
name
class foo:
name1 = 'test1'
def __init__(self):
self.name2 = 'test2'
bar = foo()
print(bar.__dict__)
# => {'name2':'test2'}
bar.name1 = 'hoge'
print(bar.__dict__)
# => {'name2':'test2','name1':'hoge'}
Les appels tels que * instance * .name affichent préférentiellement \ _ \ _dict \ _ \ _ [nom]. Appelez \ _ \ _ class \ _ \ _. Ne nommez que si \ _ \ _dict \ _ \ _ [nom] n'existe pas.
Si vous voulez utiliser une variable de classe comme valeur initiale ou comme valeur inchangée, vous devez l'écrire sans utiliser self. Comme nom1. De plus, si vous souhaitez toujours traiter avec la valeur spécifiée dans la classe, vous devez l'appeler self.class.name. Un autre avantage d'écrire comme name1 est qu'il peut être renvoyé à la valeur initiale.
name
class foo:
name1 = 'test1'
def __init__(self):
self.name2 = 'test2'
bar = foo()
print(bar.name1)
# => test1
bar.name1 = 'newname'
print(bar.name1)
# => newname
del bar.name1
print(bar.name1)
# => test1
Vous ne pouvez déclarer self.name que si vous vous attendez à ce qu'il change ou si vous n'avez pas besoin de vous souvenir de la valeur avant le changement.
Recommended Posts