博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
装饰器类学习小结
阅读量:5923 次
发布时间:2019-06-19

本文共 1621 字,大约阅读时间需要 5 分钟。

装饰器

装饰器的原理以及函数类型的装饰器在网上有很多描述,本文我就只讲我对于 将装饰器定义为类的理解。

要将装饰器定义为一个类,需要在类中声明__call____get__方法,例子如下:

from time import timeclass ttl_property(object):    def __init__(self, ttl=None):       self.ttl = ttl    def __call__(self, func):       def wrapper(*args,**kw):          if 'name' not in self.__dict__.keys():             self.__dict__['name']=(func(*args,**kw),time())          last=self.__dict__['name'][1]          value=self.__dict__['name'][0]          now=time()          if now-last>self.ttl:             value=func(*args,**kw)             self.__dict__['name']=(value,now)          return value       return wrapper    def __get__(self, instance, owner):       if instance is None:            return self       else:            return types.MethodType(self, instance)    def __set__(self, instance, value):       self.__dict__['name'] = (value, time())
from ttl_property import ttl_propertyclass Book(object):    """    >>> b = Book()    >>> b.price    80.0    >>> b.price    80.0    >>> time.sleep(3)    >>> b.price    64.0    >>> b.price    64.0    >>> time.sleep(3)    >>> b.price    51.2    """    def __init__(self):        self._price = 100.0    @ttl_property(ttl=2)    def price(self):        self._price = self._price * 0.8        return self._price

这是我在一个网站上做的,在这个实验中需要定义一个装饰器类ttl_property来装饰Book类中的函数,__call__函数可以将类的调用和函数类似,具体请查询网上资料。

我要着重强调两点:

1:装饰器类中的__get__方法很重要,因为在装饰器中返回的函数并不是原本类中的函数,也就是说在原本类所对应的实例中,这个函数并不存在,所以如果没有__get__方法,那么调用就会出问题;那么types.MethodType(self, instance)就是将方法和实例绑定起来,这样在这个实例中就包含了这个方法,就可以顺利调用了。

2:如果在原来的方法中需要使用self,那么在装饰器返回的方法中也要包含self参数,不然就不行

转载于:https://blog.51cto.com/zhengdzy/2137203

你可能感兴趣的文章
jQuery Lightbox(balupton版)图片展示插件demo
查看>>
Elasticsearch集群的简单搭建
查看>>
SCRT-SSH传输文件
查看>>
Python非常cool的svg格式chart生成库pygal
查看>>
Telnet部署与启动 windows&&linux
查看>>
行列式的乘法定理
查看>>
有1000瓶水,3个瓶子可以再换1瓶,一共可以喝多少瓶?
查看>>
Search in Rotated Sorted Array ||
查看>>
NUC_HomeWork1 -- POJ2067(最短路)
查看>>
卸载mysql
查看>>
二叉树的遍历
查看>>
The Distinguish of the share or static lib in MFC
查看>>
如何导出数据库的数据词典
查看>>
linux下内存释放问题
查看>>
让Java和JavaScript进行交互
查看>>
android 上传文件
查看>>
linux逻辑卷管理
查看>>
java结合testng,利用mysql数据库做数据源的数据驱动实例
查看>>
LINQ之路12:LINQ Operators之数据转换(Projecting)
查看>>
SQL Server:数据库角色
查看>>