python - 请问这个语句中打印的变量是类变量还是实例变量?
PHPz
PHPz 2017-04-17 17:40:17
0
5
487
class my_class():
    args1=1
    def fun(self):
        print self.args1
        
my_c=my_class()
my_c.fun()

请问在类里,那个self.args1 是类变量还是实例变量?类变量可以用self.args1用吗?

PHPz
PHPz

学习是最好的投资!

répondre à tous(5)
刘奇

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

PHPzhong

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.

class MyClass:
    args1 = 1

    def fun(self):
        print id(self.args1)


my_c = MyClass()
print id(MyClass.args1)
my_c.fun()

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

.
class MyClass:
    args1 = 1

    def fun(binding):  #这里用的是binding,而不是self
        print id(binding.args1)


my_c = MyClass()
print id(MyClass.args1)
my_c.fun()
左手右手慢动作
class myclass():
    args = 1
    def fun(self):
        print self.args
        self.__class__.args += 1

if __name__ == '__main__':
    m1 = myclass()
    m1.fun()
    m2 = myclass()
    m2.fun()

Le résultat est

 1
 2

Évidemment une variable de classe

洪涛

self.args1Il s'agit d'une variable d'instance.
my_class.args1Il s'agit d'une variable de classe.

class my_class():
    args1=1
    def fun(self):
        print self.args1      #这是实例变量
        print my_class.args1  #这是类变量
        
       
左手右手慢动作

self.args1 Ceci est une variable d'instance.
my_class.args1 Ceci est la variable de classe.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal