Python怎么实现装饰器
短信预约 -IT技能 免费直播动态提醒
小编给大家分享一下Python怎么实现装饰器,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!
普通装饰器:
直接上代码吧。
def demo(func_test): def wrapper(): print('定义的第一个装饰器') func_test() print('装饰器结束') return wrapper #这里注意不要加括号@demodef func_test(): print('小白小白!!!!')
直接使用自定义装饰器强化的原方法。
带有参数的装饰器:
def demo(func_test): def wrapper(name): print('定义的第一个装饰器') func_test(name) print('哦,你就是%s啊'%name) print('装饰器结束') return wrapper@demodef func_test(name): print('大家好我叫%s'%name)
是不是有点感觉了啊。
接下来就是不带自定义参数的装饰器
def demo(func_test): def wrapper(*name,**kwargs): print('定义的第一个装饰器') func_test(*name,**kwargs) print('哦,你就是%s啊'%name[0]) print('你今年%s岁啊'%name[1]) print('装饰器结束') return wrapper@demodef func_test(name,age): print('大家好我叫%s'%name) print('今年{}'.format(age))
是不是很简答啊。哈哈哈哈
多个装饰一起使用。
def deco01(func): def wrapper(*args,**kwargs): print('第一层的装饰器') func(*args,**kwargs) print('第一层装饰器结束') return wrapperdef deco02(func): def wrapper(*args,**kwargs): print('这是第二层装饰器') print('第二层装饰器结束') func(*args, **kwargs) return wrapper@deco02@deco01def func(a,b,c,name): print('hello ,here is a func') print("result is %d" %(a+b+c)) print('name:{}'.format(name))
看看执行顺序可以看出装饰器是从上往下执行的。
类装饰器:
在使用装饰器时我们总不能在一个文件里写的都是装饰器和各个方法吧,总是要分开的。这里就要是讲一个类装饰器。
这里呢,我大概了写了一个读取文件装饰器的例子。
class Mydecorator(): def __init__(self,func): # 定义为私有属性 self.func = func # 实现__call__方法,让对象变成可以调用的对象,可调用的对象可以想函数那样使用 def __call__(self, *args, **kwargs): print('测试类装饰器') self.func(*args) catalogue = args[0] suffix = catalogue.split('.')[2] try: if suffix == 'json': with open(*args,'r',encoding='utf-8') as file_object: contents = json.load(file_object) print(contents) else: with open(*args,'r',encoding='utf-8') as file_object: contents = file_object.read() print(contents) except Exception as a: print('读取文件出错拉:{}'.format(a))@Mydecoratordef name(name): print('请输入对应文件路径:%s'%name)
以上是“Python怎么实现装饰器”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网行业资讯频道!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341