首页 / PYTHON / python 装饰器
python 装饰器
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python 装饰器,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2250字,纯文字阅读大概需要4分钟。
内容图文
![python 装饰器](/upload/InfoBanner/zyjiaocheng/740/7a0728a8f75e4b65bf2d341c62dfe692.jpg)
1 函数装饰器
构成:外部函数传入被装饰函数名,内部函数返回装饰函数名 特点:不修改函数的调用方式,不修改函数的代码 作用:在不对函数做任何修改的情况下增加额外的功能 例如:缓存装饰器,权限验证装饰器,日志装饰器,路由装饰器,异常处理装饰器,错误重试装饰器,计时装饰器等 函数装饰器装饰函数import time def timmer(func): def wrapper(*args,**kwargs): start_time = time.time() res=func(*args,**kwargs) #如果被装饰函数有返回值,那么用res接收并return stop_time=time.time() print('run time is %s' %(stop_time-start_time)) return res return wrapper @timmer def add(a,b): return a+b
print(add(1,2)) print(add.__name__) #返回wrapper,被装饰的函数已经不再是它本身了 add=timmer(add),timmer方法返回的就是wrapper函数
函数装饰器装饰类
def Single(cls): clses = {} def single(*args, **kwargs): if cls not in clses: clses[cls] = cls(*args, **kwargs) return clses[cls] return single @Single class Food: def __init__(self,name): self.name = name a = Food('红薯') b = Food('萝卜') print(a==b)# True print(a is b)# True print(Food.__name__)#single,原理同上
函数装饰器的执行过程,我们修改一下示例1 。
def timmer(func): print('外部函数 功能1') def wrapper(*args,**kwargs): print('内部函数 功能1') res=func(*args,**kwargs) print('内部函数 功能2') return res print('外部函数 功能2') return wrapper @timmer def add(a,b): return a+b
#直接运行代码,结果:
外部函数 功能1
外部函数 功能2 可以看出在我们没有调用add方法的时候print已经生效了,这更说明被装饰的函数已经不再是他本身了
add(2,3)
外部函数 功能1
外部函数 功能2
内部函数 功能1
内部函数 功能2 综合两个结果可以看出是先执行外部函数,返回内部函数wrapper,然后执行wrapper
2 类装饰器
类装饰器主要是通过类的__call__方法来实现的
类装饰器装饰函数
class Foo(object): def __init__(self, func): self._func = func
def __call__(self): print('class decorator runing') self._func() print('class decorator ending') @Foo def bar(): print('bar') bar() print(bar.__name__) #报错,'Foo' object has no attribute '__name__'
#举个例子
class A:
def __init__(self):
pass
a = A()
print(a.__name__) # A instance has no attribute '__name__'
类装饰器装饰类
class Foo(object): def __init__(self, cls): self.cls = cls def __call__(self,name): s = self.cls(name) s.color = '红色' return s @Foo class Food: def __init__(self,name): self.name = name a = Food('红薯') print(a.name) print(a.color) print(Food.__name__)
内容总结
以上是互联网集市为您收集整理的python 装饰器全部内容,希望文章能够帮你解决python 装饰器所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。