python:装饰器
程序员文章站
2022-06-10 23:14:08
...
装饰器
1、特点:装饰器的作用就是为已存在的对象添加额外的功能,特点在于不用改变原先的代码即可扩展功能;
2、使用:装饰器其实也是一个函数,加上@符号后放在另一个函数“头上”就实现了装饰的功能,
执行被装饰的函数时,其实相当于func(*args, **kwargs) = decorator(func)(*args, **kwargs);
3、基本原理:在加载装饰器时,也就是加载到@符时,会运行一次装饰器(也就是被@后的函数),
它的返回值会替代被装饰的函数地址,而被装饰的函数的地址以装饰器函数参数的形式传进了装饰器。
如下示例中:加载到@decorator时,运行了一次decorator()函数,这时函数hello()把函数名
(也就是函数地址hello)作为装饰器参数func传了进去,decorator()执行完后返回函数inner()的函数地址,
这个函数地址替代了函数hello()的函数地址,当执行hello('Jom')时,就会执行替换后的函数,即inner('Jom'),
然后就会去执行inner()函数内的内容。
def decorator(func):
print('hello python!')
def inner(name):
print('hello, my friend')
func(name)
return inner
@decorator
def hello(name):
print('hello %s!' % name)
hello('Jom')
传参:
def decorator_var(var1, var2):
print('decorator_var')
# 装饰器的传参,就是在简单装饰器外面再套一层“壳子”
# 并且加载到装饰器的时候,会自动执行decorator_var和decorator两个函数
def decorator(func):
print('decorator')
def inner(name):
print(var1, var2)
func(name)
return inner
return decorator
@decorator_var('Python', '36')
def hello(name):
print('hello %s!' % name)
hello('Jom')
1、特点:装饰器的作用就是为已存在的对象添加额外的功能,特点在于不用改变原先的代码即可扩展功能;
2、使用:装饰器其实也是一个函数,加上@符号后放在另一个函数“头上”就实现了装饰的功能,
执行被装饰的函数时,其实相当于func(*args, **kwargs) = decorator(func)(*args, **kwargs);
3、基本原理:在加载装饰器时,也就是加载到@符时,会运行一次装饰器(也就是被@后的函数),
它的返回值会替代被装饰的函数地址,而被装饰的函数的地址以装饰器函数参数的形式传进了装饰器。
如下示例中:加载到@decorator时,运行了一次decorator()函数,这时函数hello()把函数名
(也就是函数地址hello)作为装饰器参数func传了进去,decorator()执行完后返回函数inner()的函数地址,
这个函数地址替代了函数hello()的函数地址,当执行hello('Jom')时,就会执行替换后的函数,即inner('Jom'),
然后就会去执行inner()函数内的内容。
def decorator(func):
print('hello python!')
def inner(name):
print('hello, my friend')
func(name)
return inner
@decorator
def hello(name):
print('hello %s!' % name)
hello('Jom')
传参:
def decorator_var(var1, var2):
print('decorator_var')
# 装饰器的传参,就是在简单装饰器外面再套一层“壳子”
# 并且加载到装饰器的时候,会自动执行decorator_var和decorator两个函数
def decorator(func):
print('decorator')
def inner(name):
print(var1, var2)
func(name)
return inner
return decorator
@decorator_var('Python', '36')
def hello(name):
print('hello %s!' % name)
hello('Jom')
上一篇: 有关PHP性能优化的介绍