在Python中使用abstractmethod声明所需的mixin?

时间:2012-11-09 10:06:49

标签: python mixins

我有一个“部分”类需要一些mixin才能实现其功能(出于性能和简单性的原因,我想继承它)。我可以声明我的班级需要新的方法吗?

显然以下猜测不起作用(“无法实例化抽象类”):

from abc import abstractmethod, ABCMeta

class A(metaclass=ABCMeta):
    @abstractmethod
    def a(self):
        pass

class B:
    def a(self):
        return 12

class C(A, B):
    pass

c = C()

此处A尝试声明其他方法需要a()才能工作。 (Python 3)

对声明的任何建议?

1 个答案:

答案 0 :(得分:1)

您需要在继承顺序中将B放在A前面才能使其正常工作:

>>> from abc import abstractmethod, ABCMeta

>>> class A:
...     __metaclass__=ABCMeta
...     @abstractmethod
...     def a(self):
...         pass

>>> class B:
...     def a(self):
...         return 12

>>> class C(B,A):
...     pass

>>> c = C()
>>> c
<__main__.C object at 0x10e9c40d0>


>>> class D:
...     pass

>>> class E(D, A):
...     pass

>>> e = E()
Traceback (most recent call last):
  File "<input>", line 1, in <module>
TypeError: Can't instantiate abstract class E with abstract methods a