python中的抽象类+ mixin +多重继承

mlu*_*bke 22 python abstract-class multiple-inheritance mixins

所以,我认为代码可能解释了我想要做的比我言语更好,所以这里是:

import abc

class foo(object):
    __metaclass__ = abc.ABCMeta
    @abc.abstractmethod
    def bar(self):
        pass


class bar_for_foo_mixin(object):
    def bar(self):
        print "This should satisfy the abstract method requirement"


class myfoo(foo, bar_for_foo_mixin):
    def __init__(self):
        print "myfoo __init__ called"
        self.bar()

obj = myfoo()
Run Code Online (Sandbox Code Playgroud)

结果:

TypeError: Can't instantiate abstract class myfoo with abstract methods bar
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用mixin类来满足abstract/interface类的要求.我错过了什么?

nik*_*kow 19

遗产不应该相反吗?在MRO foo目前来临之前bar_for_foo_mixin,然后理所当然地抱怨.有了class myfoo(bar_for_foo_mixin, foo)它应该工作.

而且我不确定你的班级设计是否是正确的方法.由于你使用mixin来实现bar它,最好不要从foo派生,只需用'foo'类(即foo.register(myfoo))注册它.但这只是我的直觉.

为了完整起见,这里是ABCs文档.

  • 好的调用,改变继承的顺序就可以了。PS 代码被简化以说明一点。我的现实世界场景要复杂得多,有很多潜在的 mixins 和很多 myfoos。 (2认同)