【发布时间】:2013-05-26 10:35:14
【问题描述】:
我正在尝试创建一个继承自 str 类型和第二个类的派生类。这是有问题的,因为str 类型不是简单地调用__init__,而是__new__ 方法,因为它的不变性。我知道要让__init__ 和 super 正常工作,您需要一直使用相同的调用结构。但是以下实现失败:
class base(object):
def __new__(cls, *args, **kwargs):
print "NEW BASE:", cls, args, kwargs
return super(base, cls).__new__(cls, *args, **kwargs)
def __init__(self, *args, **kwargs):
print "INIT BASE", args, kwargs
class foo(base, str):
def __new__(cls, *args, **kwargs):
return super(foo, cls).__new__(cls, *args, **kwargs)
def __init__(self, *args, **kwargs):
super(foo, self).__init__(*args, **kwargs)
这里foo('cat') 与:
>> NEW BASE: <class '__main__.foo'> ('cat',) {}
>> INIT BASE ('cat',) {}
但是有一个参数foo('cat', x=3),它失败了:
>> NEW BASE: <class '__main__.foo'> ('cat',) {'x': 3}
Traceback (most recent call last):
File "inh.py", line 19, in <module>
foo('cat', x=3)
File "inh.py", line 12, in __new__
return super(foo, cls).__new__(cls, *args, **kwargs)
File "inh.py", line 4, in __new__
return super(base, cls).__new__(cls, *args, **kwargs)
TypeError: str() takes at most 1 argument (2 given)
我可以通过将base.__new__ 方法更改为:
def __new__(cls, *args, **kwargs):
return super(base, cls).__new__(cls)
但现在我改变了调用结构,我觉得这会在以后给我带来麻烦。
如何正确地从字符串和第二个类继承?
【问题讨论】:
标签: python inheritance multiple-inheritance super abc