文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Python装饰器的定义形式有哪些

2023-07-04 15:47

关注

这篇文章主要讲解了“Python装饰器的定义形式有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python装饰器的定义形式有哪些”吧!

前言

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

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

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

用函数装饰函数

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

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

然后作用在一个函数上:

@decoratedef 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

使用该装饰器:

@singletonclass MyClass:    def method(self):        pass

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

obj = MyClass()  # creates a new instanceobj2 = MyClass()  # returns the same instanceobj3 = MyClass()  # returns the same instance...

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

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

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

再作用在一个函数上:

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

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

class MyDecorator:    def __init__(self, function):        self.function = function         def __call__(self, *args, **kwargs):         # We can add some code        # before function call         self.function(*args, **kwargs)         # We can also add some code        # after function call.# adding class decorator to the function@MyDecoratordef 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装饰器的定义形式有哪些”的内容了,经过本文的学习后,相信大家对Python装饰器的定义形式有哪些这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯