python 单例模式----装饰器实现

本文介绍了Python中使用装饰器结合闭包实现单例模式的方法。首先解释了闭包的作用,即延长局部变量的生命周期。接着讨论了装饰器的概念。然后详细说明了如何利用装饰器和闭包创建单例,确保类在整个项目运行期间只有一个实例。单例模式有助于简化参数传递,提高代码可读性。最后,作者提到Python中还有其他单例实现方式,并欢迎分享关于单例模式优缺点的知识。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、闭包的实现

#coding:utf-8
def A():
    s1=2
    def B():
        sum1=s1+2
        return sum1
    return B

if __name__ == '__main__':
    f1=A()
    f2=f1()
    print 'f1: ',f1
    print 'f2: ',f2
输出:
f1:  <function B at 0x02BDEB30>
f2:  4

可以看出f1为一个函数,调用这个函数时,才会返回值

闭包可以使得内函数返回的局部变量的生命周期与整个项目相同,即sum1会一直保留到整个工程运行结束,而不是这个函数执行完。

2、python 装饰器

def fun1(fun):
    print 'fun1 action'
    return fun

@fun1    
def fun2():
    print 'fun2 action'
    
if __name__ == '__main__':
    fun2()
输出:
fun1 action
fun2 action
@fun1的功能:实际上是将fun2作为参数传递fun1再进行执行

3、装饰器+闭包实现单例模式

单例模式:顾名思义,一个类,在整个项目的运行周期内只有一个实例

实现:

def singleton(cls, *args, **kw):
    instance={}
    def _singleton():
        if cls not in instance:
            instance[cls]=cls(*args, **kw)
        return instance[cls]
    return _singleton

@singleton
class test_singleton(object):
    def __init__(self):
        self.num_sum=0
    def add(self):
        self.num_sum=100
输出:
<__main__.test_singleton object at 0x023F6AD0>
<__main__.test_singleton object at 0x023F6AD0>
可以看出,虽然进行了两次实例化,但仍为同一个实例
不使用单例模式时:

class test_singleton(object):
    def __init__(self):
        self.num_sum=0
    def add(self):
        self.num_sum=100
    
if __name__ == '__main__':
    cls1= test_singleton()
    cls2= test_singleton()
    print cls1
    print cls2
输出:
<__main__.test_singleton object at 0x022569F0>
<__main__.test_singleton object at 0x02256A10>
显然,此时为两个不同的实例

至于单例模式在python中的作用,我第一次使用,是因为传参传了太多层,以至于我找不到参数是哪里来的了(传参为类),可是如果把传的参数设置成单例模式,便可以直接在程序中直接使用该类的成员变量,通过类名().变量名的形式,而不需要再进行参数传递,数据是从哪里来的,也一目了然,感觉比较方便。

另:python中的单例模式还有其他多种实现方式,个人觉得这种最容易理解,至于使用单例模式的缺点暂时还没研究,有了解的还望不吝赐教O(∩_∩)O

----------------------python学习笔记-----------------------------------






评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值