国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

python裝飾器和描述器的使用總結(jié)

xietao3 / 1917人閱讀

摘要:所有的描述器協(xié)議如下如果一個(gè)對象同時(shí)定義了和它叫做資料描述器。僅定義了的描述器叫非資料描述器描述器在屬性訪問時(shí)被自動調(diào)用。

被某些中文教程坑過,我的建議是有問題看官方文檔,即使沒有很詳細(xì)的例子,至少不坑

裝飾器

毫無疑問在python中用得非常多

def deco(func):
    def _deco():
        print "before invoked"
        func()
        print "after invoked"
    return _deco

@deco
def f():
    print "f is invoked"

f上加deco裝飾器相當(dāng)于f = deco(f), 和functools.partial有些類似

如果被裝飾的函數(shù)f帶參數(shù)且有返回值

def deco(func):
    def _deco(*args, **kwargs):
        print "before invoked"
        ret = func(*args, **kwargs)
        print "after invoded"
        return ret
    return _deco

@deco
def f(a):
    print "f is invoked"
    return a + 1

如果裝飾器帶有參數(shù),需要多包一層,把參數(shù)調(diào)用包進(jìn)去

def deco(*args):
    def _deco(func):
        def __deco(*args, **kwargs):
            print "decorator args is", args
            print "before invoked"
            ret = func(*args, **kwargs)
            print "after invoded"
            return ret
        return __deco
    return _deco
   
@deco("test")
def f(a):
    print "f is invoked"
    return a + 1

只有最里面一層的__deco才會每次都調(diào)用,其它外層函數(shù)只在包裝時(shí)調(diào)用一次,當(dāng)然,你可以在其中聲明變量,然后拿到__deco里使用。如果需要保留函數(shù)名,則在__deco上加@functools.wraps裝飾器

使用 作裝飾器,注意是此時(shí)相當(dāng)于裝飾函數(shù),被裝飾的函數(shù)會作為實(shí)例化參數(shù),得到一個(gè)類實(shí)例,以python wiki上一個(gè)做登錄檢查的代碼為例

class LoginCheck:
    def __init__(self, f):
        self._f = f

    def __call__(self, *args):
        Status = check_function()
        if Status is 1:
            return self._f(*args)
        else:
            return alt_function()


def check_function():
    return test


def alt_function():
    return "Sorry - this is the forced behaviour"


@LoginCheck
def display_members_page():
    print "This is the members page"
描述器

描述器在監(jiān)視特定屬性的時(shí)候很有用,其只在新式類中起作用。所有的描述器協(xié)議如下:

descr.__get__(self, obj, type=None) --> value
descr.__set__(self, obj, value) --> None
descr.__delete__(self, obj) --> None

如果一個(gè)對象同時(shí)定義了 __get__()__set__(),它叫做資料描述器(data descriptor)。僅定義了 __get__() 的描述器叫非資料描述器
描述器在屬性訪問時(shí)被自動調(diào)用。舉例來說, obj.x 會在 obj 的字典中找x ,如果x定義了 __get__方法,那么 x.__get__(obj)會依據(jù)下面的優(yōu)先規(guī)則被調(diào)用

調(diào)用優(yōu)先級:
資料描述器 -> 實(shí)例字典 -> 非資料描述器

常用的描述器就是property了,一般都只實(shí)現(xiàn)了__get__的接口
先給出一個(gè)classmethod的實(shí)現(xiàn)和一個(gè)用于測試描述器優(yōu)先級的類

class classproperty(object):
    def __init__(self, func):
        self.func = func

    def __get__(self, instance, owner):
        return self.func(owner)


class MyClass(object):

    @classproperty
    def name(cls):
        return cls.__name__

    @property
    def x(self):
        return self._data

    @x.setter
    def x(self, value):
        self._data = value

    @x.deleter
    def x(self):
        del self._data

    def __init__(self, val):
        self._data = val
        self.x = 3
        self.name = "test"

接下來調(diào)用

s = MyClass(99)
print s.x
print s.name
print s.__dict__

很明顯x是資料描述器,而name不是,所以結(jié)果是

3
5
{"_data": 3, "name": "test"}

如果給classproperty加上__set__,那么就會調(diào)用被裝飾的name,而不是實(shí)例化時(shí)實(shí)例字典中的name

一個(gè)property的python 實(shí)現(xiàn)

class Property(object):
    "Emulate PyProperty_Type() in Objects/descrobject.c"

    def __init__(self, fget=None, fset=None, fdel=None, doc=None):
        self.fget = fget
        self.fset = fset
        self.fdel = fdel
        self.__doc__ = doc

    def __get__(self, obj, objtype=None):
        if obj is None:
            return self
        if self.fget is None:
            raise AttributeError, "unreadable attribute"
        return self.fget(obj)

    def __set__(self, obj, value):
        if self.fset is None:
            raise AttributeError, "can"t set attribute"
        self.fset(obj, value)

    def __delete__(self, obj):
        if self.fdel is None:
            raise AttributeError, "can"t delete attribute"
        self.fdel(obj)

    def getter(self, fget):
        return type(self)(fget, self.fset, self.fdel, self.__doc__)

    def setter(self, fset):
        return type(self)(self.fget, fset, self.fdel, self.__doc__)

    def deleter(self, fdel):
        return type(self)(self.fget, self.fset, fdel, self.__doc__)

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/37708.html

相關(guān)文章

  • Python學(xué)習(xí)之路26-函數(shù)裝飾器和閉包

    摘要:初步認(rèn)識裝飾器函數(shù)裝飾器用于在源代碼中標(biāo)記函數(shù),以某種方式增強(qiáng)函數(shù)的行為。函數(shù)裝飾器在導(dǎo)入模塊時(shí)立即執(zhí)行,而被裝飾的函數(shù)只在明確調(diào)用時(shí)運(yùn)行。只有涉及嵌套函數(shù)時(shí)才有閉包問題。如果想保留函數(shù)原本的屬性,可以使用標(biāo)準(zhǔn)庫中的裝飾器。 《流暢的Python》筆記本篇將從最簡單的裝飾器開始,逐漸深入到閉包的概念,然后實(shí)現(xiàn)參數(shù)化裝飾器,最后介紹標(biāo)準(zhǔn)庫中常用的裝飾器。 1. 初步認(rèn)識裝飾器 函數(shù)裝飾...

    sunny5541 評論0 收藏0
  • Python中的函數(shù)裝飾器和閉包

    摘要:變量查找規(guī)則在中一個(gè)變量的查找順序是局部環(huán)境,閉包,全局,內(nèi)建閉包引用了自由變量的函數(shù)。閉包的作用閉包的最大特點(diǎn)是可以將父函數(shù)的變量與內(nèi)部函數(shù)綁定,并返回綁定變量后的函數(shù),此時(shí)即便生成閉包的環(huán)境父函數(shù)已經(jīng)釋放,閉包仍然存在。 導(dǎo)語:本文章記錄了本人在學(xué)習(xí)Python基礎(chǔ)之函數(shù)篇的重點(diǎn)知識及個(gè)人心得,打算入門Python的朋友們可以來一起學(xué)習(xí)并交流。 本文重點(diǎn): 1、掌握裝飾器的本質(zhì)、功...

    caozhijian 評論0 收藏0
  • Python中的上下文管理器和else塊

    摘要:上下文管理器協(xié)議包含和兩個(gè)方法。因此必要時(shí)在上下文管理器函數(shù)中使用語句防范錯(cuò)誤。構(gòu)建臨時(shí)忽略指定異常的上下文管理器。這是個(gè)基類,用于定義基于類的上下文管理器。塊結(jié)束時(shí),按照后進(jìn)先出的順序調(diào)用棧中各個(gè)上下文管理器的方法。 導(dǎo)語:本文章記錄了本人在學(xué)習(xí)Python基礎(chǔ)之控制流程篇的重點(diǎn)知識及個(gè)人心得,打算入門Python的朋友們可以來一起學(xué)習(xí)并交流。 本文重點(diǎn): 1、掌握if語句之外的el...

    Michael_Lin 評論0 收藏0
  • 【用故事解讀 MobX 源碼(四)】裝飾器 和 Enhancer

    摘要:所以這是一篇插隊(duì)的文章,用于去理解中的裝飾器和概念。因此,該的作用就是根據(jù)入?yún)⒎祷鼐唧w的描述符。其次局部來看,裝飾器具體應(yīng)用表達(dá)式是,其函數(shù)簽名和是一模一樣。等裝飾器語法,是和直接使用是等效等價(jià)的。 ================前言=================== 初衷:以系列故事的方式展現(xiàn) MobX 源碼邏輯,盡可能以易懂的方式講解源碼; 本系列文章: 《【用故事解...

    maybe_009 評論0 收藏0
  • Python裝飾器、迭代器和生成器

    摘要:在學(xué)習(xí)的時(shí)候,三大名器對沒有其他語言編程經(jīng)驗(yàn)的人來說,應(yīng)該算是一個(gè)小難點(diǎn),本次博客就博主自己對裝飾器迭代器和生成器理解進(jìn)行解釋。 在學(xué)習(xí)python的時(shí)候,三大名器對沒有其他語言編程經(jīng)驗(yàn)的人來說,應(yīng)該算是一個(gè)小難點(diǎn),本次博客就博主自己對裝飾器、迭代器和生成器理解進(jìn)行解釋。 裝飾器 什么是裝飾器?裝飾從字面意思來誰就是對特定的建筑物內(nèi)按照一定的思路和風(fēng)格進(jìn)行美化的一種行為,所謂器就是工具...

    30e8336b8229 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<