我似乎无法找到有关我正在尝试做什么的信息,因此我担心答案是“你做不到”或“这是不好的做法”。但是,在这里:
鉴于以下内容:
Class A(object):
def __init__(self):
pass
def methoda(self):
return 1
Class C(object):
def __init__(self):
pass
def methodc(self):
return 2
import A, C
Class B(object):
def __init__(self, classC):
A.__init__(self)
if classC:
C.__init__(self)
def methodb(self):
return 2
显然,跑步:
b = A()
b.methoda()
会因错误而崩溃:
Unbound method __init()___ must be called with A class as first argument (got B instance instead)
但是,我基本上在寻找一种方法来完成这项工作。我的动机:
有些类(可能在将来)会复制某组方法(比如一些奇特的转换)。为了减少代码,我希望将来的类继承方法;但由于遗留原因,我不希望B继承C。
答案 0 :(得分:1)
一对解决方案:
不要直接使用特殊方法:
class A(object):
def __init__(self):
self._init(self)
@staticmethod
def _init(self):
...actual initialization code here...
def methoda(self):
return 1
class C(object):
def __init__(self):
self._init(self)
@staticmethod
def _init(self):
...actual initialization code here...
def methodc(self):
return 2
import A, C
class B(object):
def __init__(self, classC):
A._init(self)
if classC:
C._init(self)
def methodb(self):
return 2
或涉及从初始化对象复制的愚蠢黑客:
import A, C
class B(object):
def __init__(self, classC):
vars(self).update(vars(A()))
if classC:
vars(self).update(vars(C()))
def methodb(self):
return 2
请注意,这些解决方案都无法在A
的实例上访问C
或B
的方法。那只是丑陋的。如果你真的需要继承,使用继承,不要尝试很难模拟它。
答案 1 :(得分:0)
我最终只是继承了多个类。这不完全是我想要的方式,但它更干净,更容易让IDE遵循
Class A(object):
def __init__(self):
super(A, self).__init__()
pass
def methoda(self):
return 1
Class C(object):
def __init__(self):
super(C, self).__init__()
def _C_init(self):
# some init stuff
pass
def methodc(self):
return 1
Class B(A, C):
def __init__(self, use_C):
super(B, self).__init__()
if use_C:
self._C_init()
def methodb(self):
return 2