2013-04-08 91 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) 
相關問題