2016-04-23 65 views
0

雖然在Python中使用OOP範例「玩」時遇到了一些誤解。 讓我們看到了一些小例子:在Python中創建和比較沒有變量賦值的類實例

class A(object): 
    pass 

print id(A()), id(A()) # 139865221604432 139865221604432 
print id(A()) == id(A()) # True 
print A() is A()   # False 
a1 = A()     
print id(a1)    # 139865221604432 
a2 = A() 
print id(a2)    # 139865220638096 

所以,問題是爲什麼第一個印刷例如ID號是兩個實例相同。當我們看看A() is A()時,我們可以看到所有的都是'好的',結果是False。不確定,但它可以處理垃圾收集?

又如:

class B(object): 

    def __init__(self): 
     self.msg = 'Some default message' 
     print id(self) 

    def do_smth(self, msg): 
     self.msg = msg 

    def get_msg(self): 
     return self.msg 

然後我們有兩種情況。

1:

B().do_smth(B().get_msg() + ' add') 

第二

b = B() 
b.do_smth(b.get_msg() + ' add') 

據我瞭解的第二種方法是更加理想,因爲我們沒有創建兩個實例像在第一個。但是當我們遇到第一種方法時,有沒有什麼有趣的案例?

回答

0

從Python documentationid功能...

兩個對象具有非重疊的壽命可以具有相同的ID()值。

當你

print id(A()), id(A()) 

它打印爲每個對象相同的ID,因爲第一對象已超出範圍。您創建的每個A實例都只存在於對id的調用中。一旦變量超出範圍,就可以收集並重用其ID。只要將對象分配給一個變量,該變量在變量超出範圍之前不能重用。

在第二個例子中,第二個表單比第一個表單更受歡迎的原因是通常對象實例的狀態不同。你的第一個表格只能工作,因爲B的所有實例都具有相同的值 - 對於一個班級來說,這是一個不尋常的屬性。然而,值得注意的是,OO的做法通常不是最好的辦法就是向對象提出一段數據,然後將這些數據作爲方法參數傳回給對象。