我的类层次结构如下:
class ContextSummary(object):
def __init__(self, id, db):
self.db = db
self.id = id
class GroupContextSummary(ContextSummary):
def __init__(self, gId, db = {}):
super(GroupContextSummary, self).__init__(gId, db)
我在单元测试中多次使用GroupContextSummary
类而没有第二个参数。
groupSummary = GroupContextSummary(gId)
问题是db仍然保留以前的运行值。为了防止这种情况,我不得不使用
groupSummary = GroupContextSummary(gId, {})
或者我必须将init方法重新定义为
def __init__(self, gId, db = None):
if db is None: db = {}
super(GroupContextSummary, self).__init__(gId, db)
可能出现什么问题?
答案 0 :(得分:1)
python中的默认值的常见问题。默认值在函数定义时分配,而不是在调用函数时分配。 一种解决方案是:
def func(a, b=None):
if not b:
b = {}
显然,如果None是b的合法参数,则不希望使用None作为b的默认值。哎呀。你已经知道了。
答案 1 :(得分:1)
每当您将可变对象传递给函数时,如果要对内容进行任何更改,应立即复制它。这不仅适用于__init__
,也适用于任何功能。如果参数甚至没有默认值,也是如此。
您应该将ContextSummary
中的行替换为:
self.db = db.copy()
我假设你不打算修改你传入的对象。如果函数的意图是修改它的参数,那么它有默认值吗?< / p>