在Cython中,Singleton不工作[英] Singleton is not working in Cython

本文是小编为大家收集整理的关于在Cython中,Singleton不工作的处理方法,想解了在Cython中,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

我认为这是在初始化之前运行的C代码(Cinit),因此我试图将Cinit重新放回初始,也无法正常工作. 如果我在" class"之前删除了" cdef"

,就可以解决问题

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

赢10/python 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

本文地址:https://www.itbaoku.cn/post/1793838.html