Python单例的一种简单写法

Posted weiyinfu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python单例的一种简单写法相关的知识,希望对你有一定的参考价值。

最原始的想法就是每个类都重写new方法。

class Dog:
    dog = None

    def __new__(cls, *args, **kwargs):
        if cls.dog is None:
            cls.dog = object.__new__(cls)
            print('create singleton over')
        return cls.dog

    def __init__(self, name):
        print('init is called')
        self.name = name


# 下面这句话会报错,因为Dog.dog目前为None
# print(Dog.dog.name)
x = Dog('x')
y = Dog('y')
print(x.name)  # y
print(y.name)  # y

最简单的方法是把重写new函数的工作放到一个父类里面,这样就能够实现:只需要继承父类就能够让自己变成单例。

"""
extend this class can make singleton class easily
"""


class Singleton:
    _instance = None

    def __new__(cls, *args, **kwargs):
        if not cls._instance:
            cls._instance = object.__new__(cls)
        return cls._instance


class Dog(Singleton):
    def __init__(self, name):
        self.name = name


x = Dog('x')
y = Dog('y')
print(x.name, y.name)

Python的单例相对于Java的单例来说,简明直接得多。我们依旧可以像创建对象一样获取单例的引用,而不必像Java那样只能通过一个函数来获取已经存在的对象。但是,Java单例的实现在语言层面上不做任何修改,Python的单例拦截了对象的创建(new)过程。因为Java的单例没有对语言层面做修改,而Python的灵活性使得Java只是Python的一个子集,所以Java单例的那套创建方式在Python这里同样适用。

需要知道的一点是:Python的new函数才是真正的开辟空间的过程,init函数只是赋值、初始化的过程。

在Python中,我们创建的任何一个对象,无需重写setattr方法即可随便往对象上“悬挂”成员变量。

class Ha:
    pass


x = Ha()
x.dog = 3
print(x.dog)

以上是关于Python单例的一种简单写法的主要内容,如果未能解决你的问题,请参考以下文章

C++ 单例模式总结与剖析

一日一技:Python 下面最简单的单例模式写法

单例的7种写法

C++ 单例模式总结与剖析

C++ 单例模式总结与剖析

MonoBehaviour单例的另外一种省事的写法