【问题标题】:change method resolution order更改方法解析顺序
【发布时间】: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


【解决方案1】:

只需将 C 类的定义更改为: C类(B,A): ... ie : 改变继承类的顺序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-05
    • 2012-05-27
    • 1970-01-01
    • 2016-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多