之间的区别。 和自我。 在python类

问题描述:

我想知道两个类中的Foo.var = user输入和self.var = userinput之间有什么区别。<class name>之间的区别。 <var name>和自我。 <var name>在python类

class foo(): 
    var=None 

    def __init__(self,userinput): 
     foo.var=userinput 


class bar(): 
    var=None 

    def __init__(self,userinput): 
     self.var=userinput 

foo指的类,self对象

类成员是类的属性(因此在该类的所有对象之间共享),而实例成员是特定对象的属性,因此对实例成员的更改仅影响给定对象。

当一个对象进行操作,它的成员是成员的合并和实例成员。当定义两个同名的成员时,实例成员具有优先权。

因此:

  • bar设置一个实例变量;这种改变只对当前实例的效果,所以,如果你这样做:

    b=bar(10) 
    c=bar(20) 
    

    你会看到c.var20b.var10;这里没什么奇怪的

  • foo设置一个类变量,这是所有实例共有的;所以,如果你这样做:

    f=foo(10) 
    g=foo(20) 
    

    ,你会看到,无论f.varg.var20,因为他们都实际上是指foo.var,这是最后一组,以20g的构造;

  • 另一方面,实例变量影子类变量;所以,如果你做

    f=foo(10) 
    g=foo(20) 
    f.var=30 
    

    你必须g.var==foo.var==20,但f.var==30,因为现在f.var实例变量 F。VAR; ,如果你这样做

    del f.var 
    

    现在实例(f的)属性var不再存在,因此f.var再次指类属性var(因此f.var==g.var==foo.var==20)。


长话短说:通常你需要使用self.var(即实例成员); classname.var仅用于在给定类的所有实例之间共享内容。

+0

完美,这解释了一切。谢谢 – Belrouk 2013-04-09 04:11:59

我想指出一个现有的文章,它解释了我的观点完全不同。

Python: Difference between class and instance attributes

是,

在第一种情况下你设置的foo所有实例变量,这是因为它是一个class变量。

在第二种情况下,您只设置foo该实例的变量。

例如:

class pie(): 
    def __init__(self, j): 
     pie.var = "pies" + str(j) 
     print (self.var) 

    def __str__(self): 
     return self.var 

a = pie(1) 
b = pie(2) 

print (a) 
print (b)