美发网站怎么做sae 网站备案信息
news/
2025/9/23 21:00:09/
文章来源:
美发网站怎么做,sae 网站备案信息,徐州赶集网招聘信息,精准网络推广目录 一、基本原理二、核心作用三、Demo示例示例1#xff1a;基本装饰器示例2#xff1a;带参数的装饰器示例3#xff1a;多个装饰器 四、正确使用装饰器五、pyparamvalidate 装饰器项目 装饰器#xff08;Decorators#xff09;是 Python 中一种强大而灵活的功能#xf… 目录 一、基本原理二、核心作用三、Demo示例示例1基本装饰器示例2带参数的装饰器示例3多个装饰器 四、正确使用装饰器五、pyparamvalidate 装饰器项目 装饰器Decorators是 Python 中一种强大而灵活的功能它允许你在不修改原始函数代码的情况下动态地修改或增强函数的行为。
一、基本原理
装饰器本质上是一个函数它接受一个函数作为输入并返回一个新的函数。在这个过程中可以在新函数中添加额外的功能或者修改原始函数的行为。
二、核心作用
代码重用 装饰器可以用于包装通用的功能使其能够被多个函数共享。代码增强 通过装饰器在不改变原始函数结构的情况下为其增加额外的功能。面向切面编程 装饰器允许在不修改函数代码的情况下将横切关注点如日志、性能监控从业务逻辑中分离出来。
三、Demo示例
示例1基本装饰器 def simple_decorator(func):def wrapper():print(Something is happening before the function is called.)func()print(Something is happening after the function is called.)return wrappersimple_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.decorator 语法糖是 Python 装饰器的简便写法这段代码等效于say_hello simple_decorator(say_hello)。
使用 decorator 语法糖时解释器会自动将下方的函数传递给装饰器并将返回的结果重新赋值给原函数名。这样可以在不改变原函数调用方式的情况下应用装饰器。
示例2带参数的装饰器 def decorator_with_args(arg):def actual_decorator(func):def wrapper(*args, **kwargs):print(fDecorator argument: {arg})for i in range(arg):func(*args, **kwargs)return wrapperreturn actual_decoratordecorator_with_args(3)
def greet(name):print(fHello, {name}!)greet(Alice)输出结果
Decorator argument: 3
Hello, Alice!
Hello, Alice!
Hello, Alice!示例3多个装饰器 def decorator1(func):def wrapper1():print(Decorator 1)func()return wrapper1def decorator2(func):def wrapper2():print(Decorator 2)func()return wrapper2decorator1
decorator2
def my_function():print(Original function)my_function()输出结果
Decorator 1
Decorator 2
Original function执行顺序说明
decorator2 在 my_function 上应用了 decorator2 装饰器。实际上这相当于执行了 my_function decorator2(my_function)将 my_function 替换为 decorator2 返回的新函数 wrapper2。然后decorator1 在已经被 decorator2 装饰过的 my_function 上再次应用了 decorator1 装饰器。这相当于执行了 my_function decorator1(decorator2(my_function))将 decorator2 返回的函数 wrapper2替换为decorator1返回的新函数 wrapper1。当调用 my_function() 时实际上是调用了经过两个装饰器包装后的新函数。执行顺序是先执行最外层的 decorator1再执行内层的 decorator2最后执行原始函数。 执行 decorator1 即执行 wrapper1()Decorator 1被打印出来然后执行 func()此时 func 为 wrapper2func() 相当于执行 wrapper2(), “Decorator 2” 被打印出来然后执行 func()此时 func为 my_functionfunc() 相当于执行 my_function()Original function被打印出来结束。
四、正确使用装饰器
下面是一段问题代码 def log_decorator(func):def wrapper(*args, **kwargs):print(fCalling {func.__name__} with arguments {args} and keyword arguments {kwargs})result func(*args, **kwargs)print(f{func.__name__} returned: {result})return resultreturn wrapperlog_decorator
def add(a, b):return a blog_decorator
def multiply(x, y):return x * yadd_result add(2, 3)
print(fadd function name: {add.__name__}) # 输出结果add function name: wrapperprint(f)multiply_result multiply(4, 5)
print(fmultiply function name: {multiply.__name__}) # 输出结果multiply function name: wrapper
输出结果
Calling add with arguments (2, 3) and keyword arguments {}
add returned: 5
add function name: wrapperCalling multiply with arguments (4, 5) and keyword arguments {}
multiply returned: 20
multiply function name: wrapper从输出结果中可以看出add.__name__ 和 multiply.__name__ 均没有正确的显示函数名称。
为了解决这个问题python 提供了内置的装饰器 functools.wraps 它的作用是在自定义装饰器中复制原始函数的元信息到装饰器返回的新函数中从而保留原函数的属性包括函数名称、文档字符串、参数信息等。
下面是正确使用装饰器的代码 def log_decorator(func):functools.wraps(func)def wrapper(*args, **kwargs):print(fCalling {func.__name__} with arguments {args} and keyword arguments {kwargs})result func(*args, **kwargs)print(f{func.__name__} returned: {result})return resultreturn wrapperlog_decorator
def add(a, b):return a blog_decorator
def multiply(x, y):return x * yadd_result add(2, 3)
print(fadd function name: {add.__name__}) # 输出结果add function name: addprint(f)multiply_result multiply(4, 5)
print(fmultiply function name: {multiply.__name__}) # 输出结果multiply function name: multiply
输出结果
Calling add with arguments (2, 3) and keyword arguments {}
add returned: 5
add function name: addCalling multiply with arguments (4, 5) and keyword arguments {}
multiply returned: 20
multiply function name: multiply五、pyparamvalidate 装饰器项目
pyparamvalidate 是一个简单易用的函数参数验证器。它提供了各种内置验证器支持自定义验证规则有助于 python 开发人员轻松进行函数参数验证提高代码的健壮性和可维护性。
项目地址github 。如果该项目对您有帮助麻烦帮忙在 github 上点个小星星。
如果您想进一步深入了解装饰器的使用请参考实现过程pyparamvalidate 参数校验器从编码到发布全过程 。
该项目最终的实现效果是一个ParameterValidator装饰器类如下
ParameterValidator(description).is_string().is_not_empty()
ParameterValidator(gender, Invalid).is_allowed_value([male, female], Gender must be either male or female)
ParameterValidator(age, param_rule_desAge must be a positive number).is_int().is_positive()
ParameterValidator(name).is_string(exception_msgName must be a string).is_not_empty()
def example_function(name, age, gendermale, **kwargs):description kwargs.get(description)return name, age, gender, description
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/913872.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!