这就是我定义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