Singleton在Cython不工作

时间:2018-07-09 11:58:27

标签: python python-2.7 cython cythonize

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

1 个答案:

答案 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