Singleton不在Cython工作



这就是我定义Singleton的方式。

class Singleton(type):
_instances = {}
def __call__(cls, *args, **kwargs):
if cls not in cls._instances:
cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
return cls._instances[cls]

然后我把我的类定义为:

class MyClass(object):
__metaclass__ = Singleton
def __init__(self):
pass

a = MyClass()
b = MyClass()

"a is b" 将返回 True

然而

cdef class MyCythonClass(object):
__metaclass__ = Singleton
def __cinit__(self):
pass
c = MyCythonClass()
d = MyCythonClass()

"c is d" 将返回 False

我以为它是在 init 之前运行的 c 代码 (cinit(,所以我试图将 cinit 放回 init,它也不起作用。 如果我删除"类"之前的"cdef",问题就解决了

我想知道为什么,可能我在这里错过了一些重要的东西。您的帮助将不胜感激。

赢 10/蟒蛇 2.7

Cython似乎不支持开箱即用的元类。但此模块可能会提供解决方法。

按如下方式实现单例可能是另一种(更安全的(替代方法:

cdef class Singleton:
_instances = {}
@classmethod
def instance(cls, *args, **kwargs):
if cls not in cls._instances:
cls._instances[cls] = cls(*args, **kwargs)
return cls._instances[cls]
cdef class MyCythonClass(Singleton):
pass
c = MyCythonClass.instance()
d = MyCythonClass.instance()
c is d  # True

最新更新