我正在使用python3.2,我有一个继承两个类的类。子类的子类__init__
函数具有不同的签名。简而言之,是否可以创建一个调用每个子类的__init__
的Parent对象?
说我有以下python3.2代码
class A(object):
def __init__(self, name):
self.ver = "the ver"
print("A::__init__ .... name = %s" % name)
class B(object):
def __init__(self,):
self.name = "the name"
print("B::__init__")
def foo(self,):
print("B::foo. The name is >>%s<<" % self.name)
class C(B,A):
def __init__(self,):
print("C::__init__")
super(B, self).__init__()
super(A, self).__init__('waaa')
我可以创建A
和B
>>> a = A('myplace')
A::__init__ .... name = myplace
>>> b = B()
B::__init__
但是,创建C
的实例失败。
>>> c = C()
C::__init__
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "<console>", line 4, in __init__
TypeError: __init__() takes exactly 2 arguments (1 given)
如果我将__init__
的{{1}}修改为
C
创建class C(B,A):
def __init__(self,):
print("C::__init__")
super(B, self).__init__('another')
super(A, self).__init__('waaa')
C
我阅读了super()
的文件,目前尚不清楚是否可以拨打每个儿童班的>>> C()
C::__init__
A::__init__ .... name = another
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "<console>", line 5, in __init__
TypeError: object.__init__() takes no parameters
>>>
。
__init__
实际上正在调用类super(B, self)__init__('another')
的{{1}},而__init__
正在调用类A
的{{1}} 。
super(A, self).__init__('waaa')
不尊重它的__init__
参数?B
和super()
的所有类属性和方法的对象type
?答案 0 :(得分:1)
您错误地使用了super()
;它并不是要明确地调用特定的超级方法,而是要动态地在继承图中搜索下一个方法。 super()
使用该类型查找从开始搜索的地点,跳过传入的类型。
在这种情况下,您只需直接调用父__init__
:
class C(B,A):
def __init__(self,):
print("C::__init__")
B.__init__(self)
A.__init__(self, 'waaa')
由于您的__init__
方法具有特定签名,因此您不能只使用super()
;你的__init__
方法需要符合一个签名(可以是一个接受任意参数并忽略它不需要的东西的那个)。
要明确,super()
的第一个参数告诉它在搜索所请求的方法时跳过的类型,这就是你通常传入当前 class。
答案 1 :(得分:0)
为什么
super()
不尊重type
这个论点?
因为super()
没有使用type
参数作为要使用的类型。相反,它根据MRO使用它来确定要使用的 next 类型。这就是你传递当前类型的原因。
如何创建具有A和B的所有类属性和方法的对象C?
让A
和B
正确使用super()
。是的,它可以使构造函数的传递参数非常困难。不,没有好的解决方案,除了&#34;不要为构造函数签署不同的签名&#34;。