29

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

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 类满足抽象/接口类的要求。我错过了什么?

4

2 回答 2

26

继承不应该反过来吗?在 MROfoo目前来之前bar_for_foo_mixin,然后理所当然地抱怨。有了class myfoo(bar_for_foo_mixin, foo)它应该可以工作。

而且我不确定您的课程设计是否是正确的方法。由于您使用 mixin 来实现bar,因此最好不要从 foo 派生而只需将其注册到 'foo' 类(即foo.register(myfoo))。但这只是我的直觉。

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

于 2009-05-05T17:49:37.620 回答
1

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

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()
于 2013-09-06T10:25:40.343 回答