@singleton的实现原理是,在装饰的类中实现一个__new__方法,在该方法中判断是否已经存在实例,如果存在直接返回,否则创建实例。
装饰的类只有一个实例(单例),意思是说,对于一个装饰了@singleton的类,在整个程序运行期间,只会创建一个该类的实例。比如,我们有这样一个类:
@singleton class Test: ...
装饰了@singleton之后,无论我们调用Test()创建实例多少次,返回的 toujours 是一个实例:
t1 = Test() t2 = Test() print(t1 is t2) # True
t1和t2指向的都是同一个实例,因为@singleton实现了单例模式,确保Test类只有一个实例。而如果不使用@singleton,每次调用Test()都会返回一个新实例:
class Test: ... t1 = Test() t2 = Test() print(t1 is t2) # False
单例模式的目的是确保类只有一个实例,并提供全局访问点。这在一些场景下很有用,比如:- 数据库连接池:确保整个系统只有一个数据库连接实例
- 文件系统:确保文件系统只初始化一次
- 配置文件:确保配置只读取一次所以,@singleton装饰器的作用是实现单例模式,使得装饰的类在程序运行期间只存在一个实例。这样可以简化全局状态的访问,并带来一定的资源利用优化。