2013-04-08 78 views

回答

2

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

0

是,

在第一种情况下你设置的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) 
相关问题