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单例的一种简单写法的主要内容,如果未能解决你的问题,请参考以下文章