如何在python中使用参数创建单例类

阴影

我正在寻找创建在第一次创建中接受参数的单例类的正确方法。我的研究将我引向3种不同的方式:

元类

class Singleton(type):
    instance = None
    def __call__(cls, *args, **kwargs):
        if cls.instance is None:
            cls.instance = super(Singleton, cls).__call__(*args, **kwargs)
        return cls.instance

class ASingleton(metaclass=Singleton):
    pass

__新__

class Singleton(object):
    instance = None
    def __new__(cls, *args, **kwargs):
        if cls.instance is None:
            cls.instance = super().__new__(cls, *args, **kwargs)
        return cls.instance

装饰器

def Singleton(myClass):
    instances={}
    def getInstance(*args, **kwargs):
        if myClass not in instances:
            instances[myClass] = myClass(*args, **kwargs)
        return instances[myClass]
    return getInstance

@Singleton
class SingletonTest(object):
    pass

所有这些都可以正常工作,但是当涉及到初始化时(例如在常规类中使用__init__),我无法找出实现它的正确方法。我能想到的唯一解决方案是以这种方式使用metaclass方法:

class Singleton(type):
    instance = None

    def __call__(cls, *args, **kwargs):
        if cls.instance is None:
            cls.instance = super(Singleton, cls).__call__(*args, **kwargs)
        return cls.instance

class ASingleton(metaclass=Singleton):
    def __init__(self,j):
        self.j=j

我不知道这是否是创建接受参数的单例的正确方法。

安德烈(Andriy Ivaneyko)

我发现实现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]

# Python 2
class MyClass():
    __metaclass__= Singleton

# Python 3
class MyClass(metaclass=Singleton):
     pass

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在Scala中使用运行时参数创建单例对象

来自分类Dev

如何在Python中使用任意数量的关键字参数制作单例对象?

来自分类Java

如何使用枚举创建单例类

来自分类Java

如何在单例类Spring Boot中使用服务(将不同的服务与“常规”类连接)

来自分类Dev

如何在Kotlin中使数据类单例?

来自分类Dev

如何在GoLang中创建单例DB类

来自分类Dev

如何在C ++中创建简单的单例类?

来自分类Dev

如何在Swift中为通用类创建单例

来自分类Dev

如何在Javascript中创建单例类?

来自分类Dev

如何在iOS中创建单例类?

来自分类Dev

如何在广播接收器中使用助手类作为单例?

来自分类Dev

如何在php父类中使用单例和静态后期绑定

来自分类Dev

如何在python中以单例继承基类

来自分类Java

如何在Java中使用Scala单例对象?

来自分类Dev

在单例中使用self作为参数

来自分类Dev

在工厂类(C ++)中使用单例

来自分类Python

如何在python中使用循环创建多个类对象?

来自分类Java

单例类如何使用接口?

来自分类Dev

如何使用单例实例模拟类

来自分类Dev

如何在其他类中使用参数化构造函数创建类的对象?

来自分类Dev

如何在Swift 2.0(iOS)的单例类中创建可全局访问的结构数据?

来自分类Dev

如何在 Spring boot 中创建不可变和单例类?

来自分类Java

如何使用拖动器2使用模拟数据创建单例类?

来自分类Dev

如何正确创建一个单例对象并在C ++中使用它?

来自分类Dev

是否需要在单例类中使用弱引用?

来自分类Dev

在单例类中使用 EF 6 读取数据

来自分类Dev

如何在 __init__ 中使用默认参数创建单独的类实例

来自分类Dev

如何在Kotlin中使用返回带有类型参数的子类型的方法创建类?

来自分类Dev

从多个位置导入单例类时如何创建?

Related 相关文章

  1. 1

    如何在Scala中使用运行时参数创建单例对象

  2. 2

    如何在Python中使用任意数量的关键字参数制作单例对象?

  3. 3

    如何使用枚举创建单例类

  4. 4

    如何在单例类Spring Boot中使用服务(将不同的服务与“常规”类连接)

  5. 5

    如何在Kotlin中使数据类单例?

  6. 6

    如何在GoLang中创建单例DB类

  7. 7

    如何在C ++中创建简单的单例类?

  8. 8

    如何在Swift中为通用类创建单例

  9. 9

    如何在Javascript中创建单例类?

  10. 10

    如何在iOS中创建单例类?

  11. 11

    如何在广播接收器中使用助手类作为单例?

  12. 12

    如何在php父类中使用单例和静态后期绑定

  13. 13

    如何在python中以单例继承基类

  14. 14

    如何在Java中使用Scala单例对象?

  15. 15

    在单例中使用self作为参数

  16. 16

    在工厂类(C ++)中使用单例

  17. 17

    如何在python中使用循环创建多个类对象?

  18. 18

    单例类如何使用接口?

  19. 19

    如何使用单例实例模拟类

  20. 20

    如何在其他类中使用参数化构造函数创建类的对象?

  21. 21

    如何在Swift 2.0(iOS)的单例类中创建可全局访问的结构数据?

  22. 22

    如何在 Spring boot 中创建不可变和单例类?

  23. 23

    如何使用拖动器2使用模拟数据创建单例类?

  24. 24

    如何正确创建一个单例对象并在C ++中使用它?

  25. 25

    是否需要在单例类中使用弱引用?

  26. 26

    在单例类中使用 EF 6 读取数据

  27. 27

    如何在 __init__ 中使用默认参数创建单独的类实例

  28. 28

    如何在Kotlin中使用返回带有类型参数的子类型的方法创建类?

  29. 29

    从多个位置导入单例类时如何创建?

热门标签

归档