2017-02-19 13 views
0

私は2つのクラスを持っています。そのコンストラクタでもう一方をインスタンス化するもの。別のクラスコンストラクタでクラスの一意のインスタンスをインスタンス化します

class Details(object): 
    pass 

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

概要のインスタンスを2つ作成すると、同じ詳細のインスタンスが変更されます。概要は、すべてのインスタンス化時にDetails()の新しいインスタンスを作成してはいけませんか?

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

# 2940786890344 
# 2940786890344 
+0

'Overview'コンストラクタのいずれにも何も渡さなかったので、それらは両方ともデフォルトインスタンス(' details = Details() ')を指しています。 – 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

関連する問題