Si vous comprenez l'espace de classe et l'espace d'instance, ce problème sera très simple. Les classes ont leur propre espace de noms et le contenu peut être consulté via className.__dict__. Si vous instanciez une instance de la même manière, cette instance aura également son propre espace de noms, qui est utilisé pour stocker les membres, les méthodes, etc. Bien entendu, une instance peut certainement partager les membres d’une classe. Spécifiquement pour votre cas, si print self.args1, il recherchera d'abord dans l'espace de noms de l'instance, et le membre args1 n'est pas trouvé, il continuera donc à trouver l'espace de la classe et trouvera args1, donc il affichera le args1 de la classe. Mais s'il existe une instruction d'affectation, telle que self.args1 = 1, alors l'instance créera le membre args1 dans son propre espace. Regardez le code ci-dessous :
In [14]: class A(object):
....: args1 = 1
....: def fun(self):
....: print self.args1
....: def fun2(self):
....: self.args1 = 2
In [15]: a = A()
In [16]: A.__dict__ # 这是类的名字空间,可以看到args1在里面
Out[16]: #删除了一些
{ 'args1': 1,
'fun': <function __main__.fun>,
'fun2': <function __main__.fun2>}
In [17]: a.__dict__ #而实例a的名字空间则没有args1
Out[17]: {}
In [18]: a.fun() #执行func 则是查找到了类的args1的成员。
1
In [19]: a.fun2() #执行了func2, 这就会在a这个实例空间里面创建args1这个成员,与类的无关。
In [20]: a.__dict__ #可以看到a的空间里面已经 有了args1.
Out[20]: {'args1': 2}
In [21]: a.fun() #再次执行,则会直接输出实例a自己的args1.
2
In [22]: A.args1 #类与实例的空间互不影响。
Out[22]: 1
In [23]: b = A() #实例之间的空间也是相互独立,
In [24]: b.args1
Out[24]: 1
Combiné avec le code ci-dessus, nous devrions pouvoir le comprendre à partir d'une essence relative
Variable de classe, cela peut être vérifié en imprimant directement l'identifiant de l'objet de classe et si l'identifiant de l'objet restreint par self est le même. L'adresse de la classe et l'identifiant de l'objet sont les mêmes. La raison pour laquelle self peut être. est utilisé parce que Python recherche d'abord les variables d'instance par défaut, puis recherche la variable de classe si elle est introuvable, elle semble donc être une variable d'objet, mais elle fait en fait référence à une variable de classe.
Si vous comprenez l'espace de classe et l'espace d'instance, ce problème sera très simple. Les classes ont leur propre espace de noms et le contenu peut être consulté via
className.__dict__
. Si vous instanciez une instance de la même manière, cette instance aura également son propre espace de noms, qui est utilisé pour stocker les membres, les méthodes, etc. Bien entendu, une instance peut certainement partager les membres d’une classe.Spécifiquement pour votre cas, si
print self.args1
, il recherchera d'abord dans l'espace de noms de l'instance, et le membreargs1
n'est pas trouvé, il continuera donc à trouver l'espace de la classe et trouvera args1, donc il affichera le args1 de la classe. Mais s'il existe une instruction d'affectation, telle queself.args1 = 1
, alors l'instance créera le membre args1 dans son propre espace. Regardez le code ci-dessous :Combiné avec le code ci-dessus, nous devrions pouvoir le comprendre à partir d'une essence relative
Variable de classe, cela peut être vérifié en imprimant directement l'identifiant de l'objet de classe et si l'identifiant de l'objet restreint par self est le même. L'adresse de la classe et l'identifiant de l'objet sont les mêmes. La raison pour laquelle self peut être. est utilisé parce que Python recherche d'abord les variables d'instance par défaut, puis recherche la variable de classe si elle est introuvable, elle semble donc être une variable d'objet, mais elle fait en fait référence à une variable de classe.
Si vous regardez plus profondément, en fait, self ne représente ici que l'objet lié. Vous pouvez également le nommer avec d'autres noms de variables
.Le résultat est
Évidemment une variable de classe
self.args1
Il s'agit d'une variable d'instance.my_class.args1
Il s'agit d'une variable de classe.self.args1 Ceci est une variable d'instance.
my_class.args1 Ceci est la variable de classe.