裝飾器類學(xué)習(xí)小結(jié)

裝飾器

裝飾器的原理以及函數(shù)類型的裝飾器在網(wǎng)上有很多描述,本文我就只講我對(duì)于 將裝飾器定義為類的理解。

從網(wǎng)站建設(shè)到定制行業(yè)解決方案,為提供成都網(wǎng)站制作、網(wǎng)站建設(shè)服務(wù)體系,各種行業(yè)企業(yè)客戶提供網(wǎng)站建設(shè)解決方案,助力業(yè)務(wù)快速發(fā)展。創(chuàng)新互聯(lián)將不斷加快創(chuàng)新步伐,提供優(yōu)質(zhì)的建站服務(wù)。

要將裝飾器定義為一個(gè)類,需要在類中聲明__call____get__方法,例子如下:

from time import time

class 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_property

class 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

這是我在一個(gè)網(wǎng)站上做的實(shí)驗(yàn),在這個(gè)實(shí)驗(yàn)中需要定義一個(gè)裝飾器類ttl_property來(lái)裝飾Book類中的函數(shù),__call__函數(shù)可以將類的調(diào)用和函數(shù)類似,具體請(qǐng)查詢網(wǎng)上資料。

我要著重強(qiáng)調(diào)兩點(diǎn):

1:裝飾器類中的__get__方法很重要,因?yàn)樵谘b飾器中返回的函數(shù)并不是原本類中的函數(shù),也就是說(shuō)在原本類所對(duì)應(yīng)的實(shí)例中,這個(gè)函數(shù)并不存在,所以如果沒有__get__方法,那么調(diào)用就會(huì)出問題;那么types.MethodType(self, instance)就是將方法和實(shí)例綁定起來(lái),這樣在這個(gè)實(shí)例中就包含了這個(gè)方法,就可以順利調(diào)用了。

2:如果在原來(lái)的方法中需要使用self,那么在裝飾器返回的方法中也要包含self參數(shù),不然就不行

當(dāng)前題目:裝飾器類學(xué)習(xí)小結(jié)
分享路徑:http://muchs.cn/article20/ipgcjo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站收錄網(wǎng)站排名搜索引擎優(yōu)化、服務(wù)器托管、網(wǎng)頁(yè)設(shè)計(jì)公司、ChatGPT

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都app開發(fā)公司