0

我想创建一个可以扩展 dict 功能的类。到目前为止,这是我的代码:

class Masks(dict):

    def __init__(self, positive=[], negative=[]):
        self['positive'] = positive
        self['negative'] = negative

我想在构造函数中有两个预定义的参数:正负掩码列表。当我执行以下代码时,我可以运行

m = Masks()

并创建了一个新的 mask-dictionary 对象 - 这很好。但我希望能够像使用 dicts 一样创建这个遮罩对象:

d = dict(one=1, two=2)

但是这对面具失败了:

>>> n = Masks(one=1, two=2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: __init__() got an unexpected keyword argument 'two'

我应该在 Masks的某个地方调用父构造函数init 。初始化可能。我尝试了它**kwargs并将它们传递给父构造函数,但仍然 - 出了点问题。有人可以指出我应该在这里添加什么吗?

4

2 回答 2

2

必须调用超类__init__方法。如果您希望能够使用Masks(one=1, ..)语法,那么您必须使用**kwargs

In [1]: class Masks(dict):
   ...:     def __init__(self, positive=(), negative=(), **kwargs):
   ...:         super(Masks, self).__init__(**kwargs)
   ...:         self['positive'] = list(positive)
   ...:         self['negative'] = list(negative)
   ...:         

In [2]: m = Masks(one=1, two=2)

In [3]: m['one']
Out[3]: 1

一般注意事项:不要继承内置函数!!! 扩展它们似乎一种简单的方法,但它有很多陷阱在某些时候咬你。

一种更安全的扩展内置函数的方法是使用委托,它可以更好地控制子类的行为,并且可以避免继承内置函数的许多陷阱。(请注意,实现__getattr__它可以避免显式地重新实现许多方法)

isinstance当您想将对象传递到某些执行显式检查的代码中时,应将继承作为最后的手段。

于 2013-08-23T14:56:48.840 回答
-1

由于您想要的只是带有预定义条目的常规字典,因此您可以使用工厂函数。

def mask(*args, **kw):
    """Create mask dict using the same signature as dict(),
    defaulting 'positive' and 'negative' to empty lists.
    """
    d = dict(*args, **kw)
    d.setdefault('positive', [])
    d.setdefault('negative', [])
于 2013-08-23T15:08:23.847 回答