每日一怼:没想到你年纪轻轻就会用脸吓人了
笔者对闭包,装饰器及工厂模式的理解为使用函数的内置嵌调用。
我们先从比闭包开始去认知装饰器和工厂模式。
闭包:外部函数定义的内部函数就是闭包。
闭包的作用及好处:闭包给访问外部函数定义的内部变量创造了条件。也将关于函数的一切封闭到了函数内部,减少了全局变量,这也是闭包的真实含义。
好的,我们既然知道了定义和好处就来看一个简单的闭包吧。
闭包
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()
是不是和修饰器差不多,只是多了几层嵌套而已。
它的执行结果如下。