python中的四种装饰器
https://www.cnblogs.com/JetpropelledSnake/p/8909136.html
def singleton(cls,*args,**kwargs):
instances = {}
def get_instance(*args,**kwargs):
if cls not in instances:
instances[cls]= cls(*args,**kwargs)
return instances[cls]
return get_instance
@singleton
class Student:
def __init__(self,name,age):
self.name = name
self.age =age
sdutent =Student('jiang',25)
student2 = Student('zhangsan',26)
print(student2.age)
#运行结果
F:\7-9练习代码\fuxi\venv\Scripts\python.exe F:/7-9练习代码/fuxi/shujujiegou.py
25
Process finished with exit code 0
自所以可以实现单例模式,就是在装饰器的基础上加入了闭包的保留局部变量的特性
https://www.cnblogs.com/linxiyue/p/11224322.html(装饰器于闭包的区别)
在Python中认为“一切皆对象”,类(元类除外)、函数都可以看作是对象,既然是对象就可以作为参数在函数中传递,我们现在来调用Student类来创建实例,看看实现过程。
#创建student实例
student = Student(jiang, 25)
@singleton相当于Student = singleton(Student),在创建实例对象时会先将 Student 作为参数传入到 singleton 函数中,函数在执行过程中不会执行 get_instance 函数(函数只有调用才会执行),直接返回get_instance函数名。
此时可以看作Student = get_instance,创建实例时相当于student = get_instance(jiang, 25),调用get_instance 函数,先判断实例是否在字典中,如果在直接从字典中获取并返回,如果不在执行 instances [cls] = Student(jiang, 25),然后返回该实例对象并赋值非student变量,即student = instances[cls]。