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

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 之前,然后正确地抱怨。使用类myfoo(bar_for_foo_mixin,foo)它应该可以工作。

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

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

其他提示

我认为(在类似情况下测试)反转基类有效:

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归因
不隶属于 StackOverflow
scroll top