在另一个类的构造函数中实例化一个类的唯一实例
问题描述:
我有两个类。一个在其构造函数中实例化另一个的。在另一个类的构造函数中实例化一个类的唯一实例
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
答
默认参数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
它们都指向默认实例('details = Details()'),因为您没有将任何内容传递给'Overview'构造函数。 – Carcigenicate
正确,但不应该默认实例是一个新的实例细节?每次构造函数被调用时,Details都被创建,存储在'details'中,然后存储在self.details中。 – nven
请参阅下面的答案。 – Carcigenicate