网站用户账号ip查询,阜宁网站建设找哪家好,营销软件网站,图片变视频制作软件装饰器的基本用法创建简单的装饰器带参数的装饰器装饰器链类装饰器内置装饰器 定义:装饰器是一个函数#xff0c;它接受另一个函数作为参数#xff0c;并返回一个新的函数。装饰器通常用于在函数执行前后添加额外的功能#xff0c;如日志记录、权限检查、性能测试等。
1.基… 装饰器的基本用法创建简单的装饰器带参数的装饰器装饰器链类装饰器内置装饰器 定义:装饰器是一个函数它接受另一个函数作为参数并返回一个新的函数。装饰器通常用于在函数执行前后添加额外的功能如日志记录、权限检查、性能测试等。
1.基本用法
decorator_function
def some_function():pass
相当于:
def some_function():passsome_function decorator_function(some_function)
2.创建简单的装饰器
def my_decorator(func):def wrapper():print(Something is happening before the function is called.)func()print(Something is happening after the function is called.)return wrappermy_decorator
def say_hello():print(Hello!)say_hello()
#输出:
#Something is happening before the function is called.
#Hello!
#Something is happening after the function is called.
说明:
my_decorator是一个装饰器函数它接受一个函数func作为参数。
在my_decorator内部定义了一个嵌套函数wrapper该函数在调用func之前和之后执行额外的打印操作。
my_decorator返回wrapper函数。
3.带参数的装饰器
def my_decorator(func):def wrapper(*args, **kwargs):print(Before the function call.)result func(*args, **kwargs)print(After the function call.)return resultreturn wrappermy_decorator
def greet(name):print(fHello, {name}!)greet(Alice)
#输出
#Before the function call.
#Hello, Alice!
#After the function call.
说明:
wrapper函数使用*args和**kwargs来接收任意数量的位置参数和关键字参数。
在wrapper中首先打印“Before the function call.”然后调用原始函数func并将参数传递给它。
函数执行完后打印“After the function call.”并返回原始函数的结果。
4.装饰器链
def decorator_one(func):def wrapper():print(Decorator One)func()return wrapperdef decorator_two(func):def wrapper():print(Decorator Two)func()return wrapperdecorator_one
decorator_two
def say_hello():print(Hello!)say_hello()
#输出:
#Decorator One
#Decorator Two
#Hello!
说明:
say_hello函数被decorator_one和decorator_two装饰。
当调用say_hello时首先执行decorator_one的wrapper然后执行decorator_two的wrapper最后执行say_hello。 5.类装饰器
def class_decorator(cls):cls.extra_attribute Added by decoratorreturn clsclass_decorator
class MyClass:passprint(MyClass.extra_attribute) # 输出: Added by decorator
说明:
class_decorator是一个类装饰器它接受一个类cls作为参数。
在装饰器内部向类添加一个新的属性extra_attribute。
使用class_decorator装饰MyClass使得MyClass在定义时就被修改。
6.内置装饰器
假设你有一个简单的装饰器它在调用函数之前和之后打印一些信息,在这个例子中my_decorator 是一个装饰器它使用 functools.wraps(func) 来装饰 wrapper 函数。这样做的好处是wrapper 函数将继承 func 的元数据。
import functoolsdef my_decorator(func):functools.wraps(func)def wrapper(*args, **kwargs):print(Before calling the function)result func(*args, **kwargs)print(After calling the function)return resultreturn wrapper
my_decorator
def say_hello(name):Greet someone by their name.print(fHello, {name}!)say_hello(Alice)
print(say_hello.__name__) # 输出: say_hello
print(say_hello.__doc__) # 输出: Greet someone by their name.
说明:在这个例子中say_hello 函数被 my_decorator 装饰。由于使用了 functools.wrapssay_hello 的元数据如 __name__ 和 __doc__会被保留,如果没有使用 functools.wrapssay_hello.__name__ 会是 wrapper而 say_hello.__doc__ 会是 None因为这些信息会被 wrapper 函数的元数据覆盖。