2017-02-19 90 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

相关问题