我的应用程序需要有几个继承自单个基类的Cython cdef
类,但仍然实现了许多接口。这些接口将用于对类进行isinstance()
检查,以确保它们符合某些接口。
我知道Cython不支持多重继承,但是有任何方法可以实现类似接口的行为。这似乎是Cython的一个相当明显的限制,我确定我不是唯一遇到这个问题的人。
答案 0 :(得分:3)
当你面对一个你无法改变但你想要与一个界面联系的基类时,你就像在纯Python中那样完全这样做:你使用abstract base classes module
有两种选择可供选择:
register
您的班级属于某个界面("抽象基类"),就像我为InterfaceA
所做的那样,或者__subclasshook__
,允许其使用正确的方法声明任何课程,例如我为InterfaceB
所做的。示例:
import abc
# define the interfaces as normal (non-Cython) Python classes
class InterfaceA(metaclass=abc.ABCMeta):
# Python3 syntax. metaclasses are slightly different in python2
pass
class InterfaceB(metaclass=abc.ABCMeta):
@abc.abstractmethod
def useful_function(self):
raise NotImplementedError()
@classmethod
def __subclasshook__(cls,other_cls):
if cls is InterfaceB:
if any("useful_function" in B.__dict__ for B in C.__mro__):
return True
return NotImplemented
# our Cython class
cdef class C:
def useful_function(self):
return 1
c = C()
print(isinstance(c,InterfaceA)) # prints False
InterfaceA.register(C)
print(isinstance(c,InterfaceA)) # prints True
print(isinstance(c,InterfaceB)) # prints True