装饰器
Posted 年轻人的魄力
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了装饰器相关的知识,希望对你有一定的参考价值。
写代码要遵循开发封闭原则,虽然在这个原则是用的面向对象开发,但是也适用于函数式编程,简单来说,它规定已经实现的功能代码不允许被修改,但可以被扩展,即:
封闭:已实现的功能代码块
开放:对扩展开发
简单装饰器:
def outer(function):
def inner():
print("123")
ret = function()
#return ret
return inner
@outer
def f1():
print("456")
f1()
运行后结果123 456
原理:将函数名f1当作参数传进outer函数执行outer函数 然后再赋值给f1
f1 =outer(f1) function=f1
outer函数的返回值是inner函数名 所以f1 = inner
重新执行f1()就是执行inner() 所以执行完123 后执行456
可以有多个参数
def w1(func):
2 def inner(arg1,arg2,arg3):
3 # 验证1
4 # 验证2
5 # 验证3
6 return func(arg1,arg2,arg3)
7 return inner
8
9 @w1
10 def f1(arg1,arg2,arg3):
11 print ‘f1‘
可以装饰具有处理n个参数的函数的装饰器
def w1(func):
def inner(*args,**kwargs):
# 验证1
# 验证2
# 验证3
return func(*args,**kwargs)
return inner
@w1
def f1(arg1,arg2,arg3):
print ‘f1‘
多个装饰器应用到同一个函数
def outer(function):
def inner(*args,**kwargs):
print("123")
function(*args,**kwargs)
# return ret
return inner
def outer1(function):
def inner1(*args,**kwargs):
print("wangyao")
function(*args,**kwargs)
return inner1
@outer
@outer1
def f1(a1,a2,a3):
print("456")
f1(1,2,3)
结果是123 wangyao 456
@outer1被替换成inner1()函数
再将inner1()函数应用到@outer装饰器中
以上是关于装饰器的主要内容,如果未能解决你的问题,请参考以下文章