Python中的闭包与装饰器及工厂模式

每日一怼:没想到你年纪轻轻就会用脸吓人了

笔者对闭包,装饰器及工厂模式的理解为使用函数的内置嵌调用。
我们先从比闭包开始去认知装饰器和工厂模式。
闭包:外部函数定义的内部函数就是闭包。
闭包的作用及好处:闭包给访问外部函数定义的内部变量创造了条件。也将关于函数的一切封闭到了函数内部,减少了全局变量,这也是闭包的真实含义。
好的,我们既然知道了定义和好处就来看一个简单的闭包吧。

闭包

def line(a,b):
    def line_obj(x):
        nonlocal a #nonlocal为在函数内使用且改变值的声明,和global功能相同
        a+=1
        return a*x+b
    return line_obj
line1 = line(1,1)
print(line1(2))#向line_obj中传值

整个函数的调用过程就是line–>line_obj–>print。
闭包的理解难点在于函数内的调用,请您仔细阅读理解整个流程。
以上就是一个简单的闭包了。接下来我们来看装饰器。

装饰器

学习装饰器我们一定要明白一点,装饰器就是闭包的一种体现。
我们在被调用的函数前添加装饰器,在运行被调用函数前率先运行装饰器函数。
我们来看段代码吧。


def w1(func):
    def inner():
        print('w1 inner')
        func()
    return inner
@w1 #装饰器
def f1():
    print('f1')
f1()

在这段代码中@w1就是装饰器,那么函数是怎么运行的呢?我们来看一下。
开始调用f1()–>@w1–>w1()–>inner()–>f1()这就是整段代码的运行流程了。
那么多个装饰器如何运行的呢?

def w1(func):
    def inner():
        print('w1 inner')
        func()
    return inner


def w2(func):
    def inner():
        print('w2 inner')
        func()
    return inner

@w2
@w1
def f1():
    print('f1')


f1()

他的输出结果如下。
这里写图片描述
我们可以看到我们那个修饰写在前面我们就会先执行那段代码。
接下来我们来认识一下功能工厂模式

工厂模式

简单工厂:工厂类中,根据条件决定一个接口由哪个具体产品类来实现。
工厂方法:创建多个工厂类。各个工厂类中,都对应一个获得接口A实例的方法。用户决定使用哪个工厂。
抽象工厂:对工厂方法进行扩展。各个工厂类中,再增加一个获得接口B实例的方法。
提一下,多个工厂类都继承自同一个接口。
知道什么是工厂类之后我们就来写一个简单的修饰器工厂程序吧。

def factory(arg=None):
    def timefun(func):
        def inner():
            if arg:
                print('you')

            else:
                print('wu')
            return func()
        return inner
    return timefun

@factory(1)
def f():
    print('f')


f()

是不是和修饰器差不多,只是多了几层嵌套而已。
它的执行结果如下。
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值