1

我的类层次结构如下:

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)

问题是数据库仍然保留以前的运行值。为了防止这种情况,我不得不使用

groupSummary = GroupContextSummary(gId, {})

或者我不得不将 init 方法重新定义为

def __init__(self, gId, db = None):
    if db is None: db = {}
    super(GroupContextSummary, self).__init__(gId, db)

可能有什么问题?

4

2 回答 2

1

python中默认值的常见问题。默认值是在函数定义时分配的,而不是在调用函数时分配的。 一种解决方案是这样做:

def func(a, b=None):
    if not b:
        b = {}

显然,如果 None 是 b 的合法参数,您不想使用 None 作为 b 的默认值。哎呀。你已经知道了。

于 2013-06-07T20:26:47.537 回答
1

每当您将可变对象传递给函数时,如果您要对内容进行任何更改,您应该立即复制它。这不仅适用于任何功能,__init__而且适用于任何功能。如果参数甚至没有默认值也是如此。

您应该将行替换ContextSummary为:

self.db = db.copy()

我假设您不打算修改传入的对象。如果该函数的目的是修改其参数,那么它具有默认值没有意义吗?

于 2013-06-07T21:02:06.173 回答