Python 中的装饰器介绍
装饰器是Python编程语言中一种强大的特性,用于修改或增强函数或类的行为,而无需对它们本身进行修改。装饰器通常被用于在不改变原始代码的情况下,向函数或方法添加额外的功能,如日志记录、权限检查、数据格式转换等。装饰器本质上是一个函数,它接受一个函数作为参数,并返回一个经过修改的函数或可调用对象。
在装饰器的内部,您通常会定义一个新的函数,这个函数执行了装饰器所要添加的操作,然后调用原始函数,并返回其结果。这就是为什么装饰器的返回值通常是一个函数。
然后,通过使用 @装饰器函数名 语法将装饰器应用于其他函数或方法,使其成为经过装饰的版本。这样,当您调用经过装饰的函数时,实际上是调用了装饰器内部的新函数,从而实现了对原始函数的修改或增强。
一个简单的装饰器demo:
def my_decorator(func):
def wrapper():
print("函数调用前.")
func()
print("函数调用后.")
return wrapper
@my_decorator
def say_hello():
print("Hell")
say_hello()
再看一下最近工作中写脚本,之前经常涉及到对字段进行一些额外的处理操作,比如两个字段值相加,但是源数据给的是字符串,这个时候就可以利用装饰器,对数据进行格式转换之后再操作:
def add_decorator_convert_int(func):
def wrapper(a, b):
result = func(int(a),int(b))
print(f"{a} + {b} = {result}")
return result
return wrapper
@add_decorator_convert_int
def add(a, b):
return a + b
result = add(5, 3)
result = add("5","3")
上面演示的是不带参数的装饰器,下面再来看看带参数的装饰器:
带参数的装饰器可以接收额外的参数,并在内部使用这些参数来定义装饰器的行为。这些参数可以在装饰器函数内部使用,以在调用原始函数之前或之后执行某些操作。
def validate_and_transform_data_format(data_type):
def decorator(func):
def wrapper(*args, **kwargs):
validated_args = []
for arg in args:
if isinstance(arg, data_type):
validated_args.append(arg)
else:
try:
validated_arg = data_type(arg)
validated_args.append(validated_arg)
except ValueError:
print(f"Invalid argument: {arg}. Skipping...")
return func(*validated_args, **kwargs)
return wrapper
return decorator
@validate_and_transform_data_format(int)
def calculate_sum(a, b, c):
return a + b + c
result = calculate_sum("10", 20, "30")
print("Result:", result)
输出结果:Result: 60
上面的代码,当调用 calculate_sum("10", 20, "30") 时,装饰器将会将字符串 "10" 和 "30" 转换为整数类型,然后执行函数并返回结果。
def with_parameters_decorator(arg1, arg2):
def inner_decorator(func):
def wrapper(*args, **kwargs):
# 在调用原始函数之前执行操作
print(f"函数{func.__name__}被调用前")
result = func(*args, **kwargs)
# 在调用原始函数之后执行操作
print(f"函数{func.__name__}被调用后")
return result
return wrapper
return inner_decorator
@with_parameters_decorator("Hello", "World")
def my_func():
print("被装饰器装饰的函数被调用啦")
my_func()
Python中的装饰器就先简单的介绍到这了,如果还不是很理解装饰器的用法,自己写不出来的话,可以复制文章中的案例依葫芦画瓢改一下试试。至于装饰器的一些其他应用场景啥的,只要代码写的足够多的时候,就会想着去进行优化,这个时候获取就能派上一些用场。
下一篇: TypeScript 装饰器执行原则
推荐阅读
-
KCF跟踪算法在Python中的应用
-
介绍Video.js:一个免费的视频播放器
-
介绍和选择适合的在线代码编辑器
-
Java 8新特性探究(十三)JavaFX 8新特性以及开发2048游戏-JavaFX历史## 跟java在服务器端和web端成绩相比,桌面一直是java的软肋,于是Sun公司在2008年推出JavaFX,弥补桌面软件的缺陷,请看下图JavaFX一路走过来的改进 从上图看出,一开始推出时候,开发者需使用一种名为JavaFX Script的静态的、声明式的编程语言来开发JavaFX应用程序。因为JavaFX Script将会被编译为Java bytecode,程序员可以使用Java代码代替。 JavaFX 2.0之后的版本摒弃了JavaFX Script语言,而作为一个Java API来使用。因此使用JavaFX平台实现的应用程序将直接通过标准Java代码来实现。 JavaFX 2.0 包含非常丰富的 UI 控件、图形和多媒体特性用于简化可视化应用的开发,WebView可直接在应用中嵌入网页;另外 2.0 版本允许使用 FXML 进行 UI 定义,这是一个脚本化基于 XML 的标识语言。 从JDK 7u6开始,JavaFx就与JDK捆绑在一起了,JavaFX团队称,下一个版本将是8.0,目前所有的工作都已经围绕8.0库进行。这是因为JavaFX将捆绑在Java 8中,因此该团队决定跳过几个版本号,迎头赶上Java 8。 ##JavaFx8的新特性 ## ###全新现代主题:Modena 新的Modena主题来替换原来的Caspian主题。不过在Application的start方法中,可以通过setUserAgentStylesheet(STYLESHEET_CASPIAN)来继续使用Caspian主题。 参考http://fxexperience.com/2013/03/modena-theme-update/ ###JavaFX 3D 在JavaFX8中提供了3D图像处理API,包括Shape3D (Box, Cylinder, MeshView, Sphere子类),SubScene, Material, PickResult, LightBase (AmbientLight 和PointLight子类),SceneAntialiasing等。Camera类也得到了更新。从JavaDoc中可以找到更多信息。 ###富文本 强化了富文本的支持 ###TreeTableView ###日期控件DatePicker 增加日期控件 ###用于 CSS 结构的公共 API
-
解析Python中的类的方法和概念
-
python true的值 python中true
-
Python中的大顶堆和小顶堆:实现从小到大排序的大顶堆
-
python实现二叉堆中的大顶堆(大根堆)
-
使用Python中的大顶堆heap实现堆排序算法
-
vivo V27在跑分数据库中曝光,搭载了尚未发布的联发科处理器