1 装饰器
装饰器是一种设计模式,起到装饰的作用。就是在不修改函数代码的情况下,给函数增加一些功能。
1.1 没有使用装饰器的例子
现有一个返回字符串的函数,在不修改该函数的情况下,将返回的字符串转换为大写字符串。
def uppercase_decorator(func):
def inner():
s = func()
make_uppercase = s.upper()
return make_uppercase
return inner
def say_hello():
return 'hello world.'
if __name__=="__main__":
say_hello2 = uppercase_decorator(say_hello)
print(say_hello2())
1.2 使用装饰器
Python提供了装饰器注释功能,装饰器本质上是一个函数。 上述代码使用装饰器修改如下:
def uppercase_decorator(func):
def inner():
s = func()
make_uppercase = s.upper()
return make_uppercase
return inner
@uppercase_decorator
def say_hello1():
return "zhang cheng."
if __name__=="__main__":
print(say_hello1())
1.3 同时使用多个装饰器
一个函数可以有多个装饰器声明。
def uppercase_decorator(func):
def inner():
s = func()
make_uppercase = s.upper()
return make_uppercase
return inner
def backet_decorator(func):
def inner():
s = func()
make_bracket = '(' + s + ')'
return make_bracket
return inner
@backet_decorator
@uppercase_decorator
def say_hello():
return 'hello world.'
if __name__=="__main__":
print(say_hello())
1.4 给装饰器传递参数
装饰器本质上是函数,因此可以给装饰器传递参数。
def calc(func):
def wrapper(arg1):
return func(arg1)
return wrapper
@calc
def square(n):
return n * n
@calc
def abs(n):
return n if n > 0 else -n
if __name__=="__main__":
print(f"3's square is {square(3)}")
print(f"-30's absulate is {abs(-30)}")
|