• 技术文章 >Python技术 >Python基础教程

    Python中如何使用_new_实现单例模式

    爱喝马黛茶的安东尼爱喝马黛茶的安东尼2019-07-03 11:56:29原创2580
    单例模式是一个经典设计模式,简要的说,一个类的单例模式就是它只能被实例化一次,实例变量在第一次实例化时就已经固定。

    在Python中常见的单例模式有None,这就是一个很典型的设计,通常使用 if xxx is None或者if xxx is not None来比较运算。

    Python实现单例模式

    代码如下:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    class MyClass:

        _instance = None 

        _first_init = False 

        def __new__(cls, *args, **kwargs):

            if not cls._instance:

                cls._instance = super().__new__(cls)

            return cls._instance

        def __init__(self, var1, var2):

            cls = type(self)

            if not cls._first_init:

                self.var1 = var1

                self.var2 = var2

                cls._first_init = True

    如上所示,我创建了一个MyClass的类,定义了两个类变量,第一个是_instance,它负责保存该类创建的实例。第二个是_first_init,它是一个布尔值,保存是否为第一次实例化该类。

    相关推荐:《Python视频教程

    在__new__方法中(构造函数),判断是否存在_instance这个类变量,如果之前已经实例化了,直接返回。如果是第一次实例化,就会为_instance类变量绑定实例,使用super().__new__(cls)创建实例,即调用父类object.__new__(MyClass)创建实例。

    在__init__方法中(初始化函数),我们通过cls=type(self)获取MyClass类,判断是否第一次实例化。如果是第一次实例化,就绑定实例变量。否则什么都不做。

    运行效果

    我们创建两个实例,来对比

    1

    2

    3

    4

    5

    6

    >>> instance1 = MyClass(1, 2)

    >>> instance2 = MyClass(7, 5)

    >>> id(instance1) == id(instance2)

    True

    >>> instance2.var1

    1

    可以看到,这两个实例的内存地址都相同,而且第一次实例化后变量已经固定了,全局不会再改变。

    这就是单例模式的实现。

    相关推荐:

    Python之类方法、__new__方法和__init__方法介绍

    专题推荐:python _new_ 单例模式
    上一篇:Python之类方法、__new__方法和__init__方法介绍 下一篇:Python中property特性属性是什么

    相关文章推荐

    • python抽象基类之_subclasshook_方法• Python中可迭代对象、迭代器详解• Python之类方法、__new__方法和__init__方法介绍

    全部评论我要评论

    © 2021 Python学习网 苏ICP备2021003149号-1

  • 取消发布评论
  • 

    Python学习网