2017-02-19 92 views
0

我有兩個類。一個在其構造函數中實例化另一個的。在另一個類的構造函數中實例化一個類的唯一實例

class Details(object): 
    pass 

class Overview(object): 
    def __init__(self, details = Details()): 
     self.details = details 

當我創建兩個概覽實例時,它們會更改同一個實例的詳細信息。不應該在每個實例化過程中創建一個新的Details()實例?

ov1 = Overview() 
ov2 = Overview() 
print(id(ov1.details)) 
print(id(ov2.details)) 

# 2940786890344 
# 2940786890344 
+0

它們都指向默認實例('details = Details()'),因爲您沒有將任何內容傳遞給'Overview'構造函數。 – Carcigenicate

+0

正確,但不應該默認實例是一個新的實例細節?每次構造函數被調用時,Details都被創建,存儲在'details'中,然後存儲在self.details中。 – nven

+1

請參閱下面的答案。 – Carcigenicate

回答

2

默認參數details在類創建時評價過!如果未提供,則所有Overview實例將具有相同的Details實例。沿線的改變:

class Overview(object): 
    def __init__(self, details=None): 
     self.details = Details() if details is None else details 

這是奇怪的初學者常見的來源,尤其是mutable default arguments

+0

這是有道理的。謝謝! – nven

+0

實際上,默認參數是在函數定義時計算的,這個時間早於類創建時間(首先執行整個類的主體)。 – jasonharper

相關問題