这就是我定义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是b”将返回True
但是
cdef class MyCythonClass(object):
__metaclass__ = Singleton
def __cinit__(self):
pass
c = MyCythonClass()
d = MyCythonClass()
“ c是d”将返回False
我认为这是在init之前运行的c代码(cinit),因此我尝试将cinit返回init,它也不起作用。 如果我在“类”之前删除了“ cdef”,问题就解决了
我想知道为什么这里可能缺少重要的东西。非常感谢您的帮助。
Win 10 / Python 2.7
答案 0 :(得分:2)
Cython似乎不支持现成的元类。但是this module可以提供一种解决方法。
按以下方式实施单例可能是另一种(更安全的)选择:
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