Python装饰器的四种定义形式
admin
2024-02-14 06:21:22
0

前言

装饰器(decorator)在Python框架中扮演着重要角色,是Python中实现切面编程(AOP)的重要手段。

aspect-oriented programming (AOP) ,在不改变代码自身的前提下增加程序功能

不改变代码自身,但需要在函数和类头上加一个标注(annotation),这个标注在Python里叫装饰器,在java里叫注解。
在Python里,一共有四种组合形式。下面一一举例。

用函数装饰函数

采用一个函数定义装饰器:

def decorate(f):def wrapper(*args):return f(*args)*2return wrapper

然后作用在一个函数上:

@decorate
def add(a, b):return a + b

测试一下效果:

def test_decorate():sum = add(3, 5)assert sum == 16

用函数装饰一个类

这里通过装饰器实现单例模式:

def singleton(cls):instances = {}def wrapper(*args, **kwargs):if cls not in instances:instances[cls] = cls(*args, **kwargs)return instances[cls]return wrapper

使用该装饰器:

@singleton
class MyClass:def method(self):pass

于是,当你定义多个对象时,返回的是同一实例:

obj = MyClass()  # creates a new instance
obj2 = MyClass()  # returns the same instance
obj3 = MyClass()  # returns the same instance
...

用类定义装饰器,然后装饰一个函数

先采用类定义一个装饰器:

class Star:def __init__(self, n):self.n = ndef __call__(self, fn):@wraps(fn)def wrapper(*args, **kwargs):result = fn(*args, **kwargs)return resultreturn wrapper

再作用在一个函数上:

@Star(5)
def add(a, b):return a + b

主要是在类中实现__call__方法。上面例子也可以简化:

class MyDecorator:def __init__(self, function):self.function = functiondef __call__(self, *args, **kwargs):# We can add some code# before function callself.function(*args, **kwargs)# We can also add some code# after function call.# adding class decorator to the function
@MyDecorator
def function(name, message ='Hello'):print("{}, {}".format(message, name))

用类定义装饰器,然后装饰一个类

先定义装饰器:

class MyClassDecorator(object):_instances = dict()def __init__(self, name):passdef __call__(self, cls):class WrappedClass(cls):def say_hello(self):print(f'Hello: {self.username}')return WrappedClass

该装饰器给被装饰的类上添加了一个方法,名称为say_hello()。使用如下:

@MyClassDecorator('test')
class MyClass():def __init__(self, username):self.username = username

然后:

def test_decoratorforclass():obj = MyClass('user1')obj.say_hello()

打印出: Hello: user1

小结

学习类装饰,对Python的内部机制会有更多的了解。如__init__, call, __new__等内置方法。

相关内容

热门资讯

Linux删除、创建文件命令大... 在Linux系统中,删除文件(夹)是一项基本且常用的操作。小编将为大家介绍一些常见的命令来实现这个功...
Host表:解密表的奥秘! 主机管理是网络管理中的一个重要方面,而host表就是主机管理中的一种重要工具。通过对host表的管理...
Win10 1903:让你飞一... 大家都知道,Win101903版本是微软最新推出的操作系统,但有些用户可能会遇到运行速度变慢的问题。...
重新安装IE浏览器,轻松搞定! 小编教你重新安装IE浏览器的方法 IE浏览器是许多人在日常上网中使用的一款经典浏览器,但有时候...
Linux操作:删除与创建文件... 在Linux系统中,删除和创建文件或文件夹是常见的操作。通过简单的命令,您可以轻松地完成这些任务。下...
DOS命令宝典:磁盘操作的秘籍 DOS命令,即磁盘操作系统命令,是指在DOS操作系统中使用的各种命令行工具。它们可以帮助用户进行文件...
Ubuntu系统设置中文语言:... 小编要为大家介绍的是如何在Ubuntu系统中设置中文语言。对于喜欢中文环境的用户来说,一个良好的系统...
索尼XA系列:中低端手机不忘质... 索尼一直以来都是高端相机和手机的代表品牌,然而在不断追求创新和卓越的同时,索尼也没有忘记中低端市场的...
Win8硬盘分区:简单易懂的方... Win8怎么分区?Win8硬盘分区方法 在如今信息爆炸的时代Win8怎么分区?Win8硬盘分区...
LG G5黑科技:下巴给多少分... 小编最近体验了一款引人瞩目的智能手机——LGG5,它可是黑科技的代表!今天LGG5黑科技体验:这个下...
解决英特尔CPU幽灵/熔断/僵... 小编教你一招,轻松解决英特尔CPU的三大负载漏洞! 众所周知,英特尔CPU近期曝出了幽灵、熔断...
Linux系统清理和避免僵尸进... 清理僵尸进程,守护系统平稳运行 在Linux系统中,僵尸进程是一种常见的现象。它们是已经完成执...
量子特工伪装流,玩转伪装技巧! 玩转伪装流,轻松战胜对手!你是否厌倦了常规的游戏玩法?是否渴望一种全新的挑战?那就来尝试一下量子特工...
1999元小米手机5发布会:现... 小编最近有幸参加了米手机5的发布会,并亲自体验了一下这款备受期待的新机。作为小米的旗舰产品,米手机5...
万国觉醒:简易获取装备图纸与制... 小编今天给大家带来一个超级炫酷的话题——万国觉醒装备图纸获取与装备制作简易!没错,你没有听错,就是那...
Win2008网络管理绝密技巧... 小编今天要为大家介绍一些鲜为人知的Win2008网络管理优化技巧,让你的网络畅行无阻,速度更快!快来...
Win10激活工具推荐下载,让... 小编今天要为大家推荐一款最好用的Win10激活工具,经过亲测,保证有效。对于使用Windows10操...
XP系统网络故障解决办法大揭秘 网络连接是现代人工作和生活中不可或缺的一部分,然而,在使用XP系统时XP系统故障之网络故障的几种解决...
Win8本地连接消失怎么办?解... 近日,许多Win8系统用户遇到了一个令人困扰的问题:本地连接消失了。对于需要经常使用网络的用户来说,...
Ubuntu系统轻松实现中文设... 小编今天给大家分享一下在Ubuntu系统中设置中文语言的方法。如果你想在Ubuntu上用中文愉快地工...