【发布时间】:2017-04-18 18:25:14
【问题描述】:
是否可以更改方法解析顺序?
class A(object):
def __init__(self, a):
self.a=a
def method(self):
print('A method')
class B(object):
def __init__(self, b1, b2):
self.b1=b1
self.b2=b2
def method(self):
print('B method')
class C(A, B):
def __init__(self, name, **kwargs):
if name=='A':
A.__init__(self, a=kwargs['a'])
elif name=='B':
B.__init__(self, b1=kwargs['b1'], b2=kwargs['b2'])
如果输入 name 是“B”,我想更改 MRO,这样当我打电话时:
>>>c=C(name='B', b1=2, b2=3)
>>>c.method()
它返回“B 方法”。
谢谢
【问题讨论】:
-
虽然您可以使用奇怪的元类更改 MRO,但似乎用工厂函数替换 C 或使用组合而不是多重继承会是更好的解决方案。跨度>
-
a) 为什么? b) 在 C 中存储
name并覆盖method()并有条件地调用B.method(self),类似于您在C.__init__()中已有的内容。 c) 你的构造函数跳过B的初始化。这会咬你的。 -
dhke,您的解决方案是最简单的。谢谢两位...抱歉,您打算作文什么?
-
让 C 实例包含 A 或 B,具体取决于
name参数并委托给method的包含对象。
标签: python-3.x multiple-inheritance method-resolution-order