有人可以解释以下行为:
class derivedset1(frozenset):
def __new__(cls,*args):
return frozenset.__new__(cls,args)
class derivedset2(set):
def __new__(cls,*args):
return set.__new__(cls,args)
a=derivedset1('item1','item2') # WORKS
b=derivedset2('item1','item2') # DOESN'T WORK
Traceback (most recent call last):
File "inheriting-behaviours.py", line 12, in <module>
b=derivedset2('item1','item2') # DOESN'T WORK
TypeError: derivedset2 expected at most 1 arguments, got 2
让我感到惊讶的是,您可以更改冻结集的构造函数,而可变集的构造函数则不可能。
来自Python 文档 http://docs.python.org/reference/datamodel.html#object.__new__:
If __new__()
返回一个实例cls
,那么新实例的__init__
() 方法将被调用__init__(self[, ...])
, where self
是新实例,其余参数与传递给的参数相同__new__()
.
set.__init__
仅接受一个参数,一个指定初始设置内容的可迭代对象。因此,您应该添加自己的初始化程序,它接受所有附加参数并将它们作为初始设置值提供:
class derivedset2(set):
def __new__(cls,*args):
return set.__new__(cls,*args)
def __init__(self, *initial_values):
set.__init__(self, initial_values)
请注意,您应该覆盖__init__
并避免实施__new__
除非你想实现对象缓存、单例或类似的奇怪的东西。您的子类化适用于frozenset
正是因为frozenset
does从对象缓存中获益,即 Python 解释器只需要一个frozenset
两个实例frozenset
具有相同内容的对象。
一般来说,您应该避免对内置类进行子类化,特别是如果您的语义不兼容(在这种情况下,set([])
and derivedset2([])
返回完全不同的结果)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)