繁体   English   中英

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

[英]Abstract class + mixin + multiple inheritance in python

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

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()

结果:

TypeError: Can't instantiate abstract class myfoo with abstract methods bar

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

遗产不应该相反吗? 在MRO foo目前出现在bar_for_foo_mixin之前,然后正确地抱怨。 使用class myfoo(bar_for_foo_mixin, foo)它应该可以工作。

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

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

我认为(在类似情况下测试)逆转基类工作:

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

所以在mro()中它会在找到抽象的之前找到bar()的具体版本。 不知道这是否实际上是在后台发生的事情。

干杯,拉尔斯

PS:在python 2.7中工作的代码(python 3有不同的设置元类的方法)是:

class A(object):
    __metaclass__ = abc.ABCMeta

    @abc.abstractmethod
    def do(self):
        pass

class B(object):
    def do(self):
        print "do"

class C(B, A):
    pass

c = C()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM