python中用装饰器实现单例模式

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]。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值