我想创建一个可以扩展dict功能的类。到目前为止,这是我的代码:
class Masks(dict):
def __init__(self, positive=[], negative=[]):
self['positive'] = positive
self['negative'] = negative
我想在构造函数中有两个预定义的参数:正面和负面面的列表。当我执行以下代码时,我可以运行
m = Masks()
并创建了一个新的mask-dictionary对象 - 没关系。但是我希望能够像dic一样创建这个蒙版对象:
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 。 init 。我尝试使用**kwargs
并将它们传递给父构造函数,但仍然出现了问题。有人能指出我应该在这里添加什么吗?
答案 0 :(得分:1)
您必须调用超类__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
检查的代码,则应将继承用作最后的手段。
答案 1 :(得分:-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', [])