gpt4 book ai didi

python - 有什么办法可以用 Cython 获得 "interfaces"?

转载 作者:行者123 更新时间:2023-12-04 12:49:17 27 4
gpt4 key购买 nike

我的应用程序需要有几个继承自单个基类的 Cython cdef 类,但仍实现许多接口(interface)。这些接口(interface)将用于对类执行 isinstance() 检查以确保它们符合某些接口(interface)。

我知道 Cython 不支持多重继承,但有什么办法可以实现类似接口(interface)的行为。这似乎是 Cython 中一个相当明显的限制,我相信我不是唯一遇到这个问题的人。

最佳答案

当面对无法更改但想与接口(interface)关联的基类时,您可以像在纯 Python 中那样做:您使用 abstract base classes module

有两个选项可供选择:

  1. 您可以像我为 InterfaceA 所做的那样注册您的类属于一个接口(interface)(“抽象基类”),或者
  2. 你给你的接口(interface)一个 __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

关于python - 有什么办法可以用 Cython 获得 "interfaces"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41326770/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com