成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

流暢的python:描述符

nanfeiyan / 573人閱讀

摘要:這里設(shè)置的是實例屬性實例屬性會覆蓋描述符的方法類的描述符依然存在刪除實例屬性再讀取時就會出發(fā)描述符的方法

描述符:描述符類的實例是托管類的類屬性

用于研究描述符行為的幾個方法:

def cls_name(obj_or_cls):
    cls = type(obj_or_cls)
    if cls is type:
        cls = obj_or_cls
    return cls.__name__.split(".")[-1]

def display(obj):
    cls =type(obj)
    if cls is type:
        return "".format(obj.__name__)
    elif cls in [type(None), int]:
        return repr(obj)
    else:
        return "<{} object>".format(cls_name(obj))

def print_args(name, *args):
    persudo_args = ",".join(display(x) for x in args)
    print("-> {}.__{}__({}))".format(cls_name(args[0]), name, persudo_args))


class Overriding:
    """由get 和set 方法的數(shù)據(jù)描述符,也稱覆蓋型描述符"""

    def __get__(self, instance, owner):
        print_args("get", self, instance, owner)

    def __set__(self, instance, value):
        print_args("set", self, instance, value)


class OverridingNoGet:
    """沒有g(shù)et方法的數(shù)據(jù)描述符,也稱覆蓋型描述符"""

    def __set__(self, instance, value):
        print_args("set", self, instance, vvalue)


class NonOverriding:
    """沒有set方法的非數(shù)據(jù)描述符,也稱非覆蓋型描述符"""

    def __get__(self, instance, owner):
        print_args("get", self, instance, owner)
class Managed:
    over = Overriding()
    over_no_get = OverridingNoGet()
    non_over = NonOverriding()

    def spam(self):
        print("-> Managed.spam({})".format(display(self)))

覆蓋型描述符,也叫數(shù)據(jù)型描述符

>>> from demo import *
>>> m = Manged()
>>> m.over #get里的參數(shù)分別對應(yīng)[self]Overriding實例, [instance]Managed實例,[owner]Managed類
-> Overriding.__get__(,,))
>>> Managed.over #類直接調(diào)用屬性,instance的位置為None。
-> Overriding.__get__(,None,))
>>> m.over = 7 #[self]->Overriding的實例, [instance]->Managed類的實例,[value]->設(shè)置的值[7]
-> Overriding.__set__(,,7))
>>> m.over  #讀取m.over, 還是出發(fā)__get__方法
-> Overriding.__get__(,,))
>>> m.__dict__["over"] = 8  #直接通過__dict__方法設(shè)置實例屬性
>>> vars(m)  #__dict__屬性中已經(jīng)有了over屬性
{"over": 8}
>>> m.over  #但是,實現(xiàn)了set方法的覆蓋型描述符會跳過實例屬性,直接讀取描述符屬性
-> Overriding.__get__(,,))

沒有g(shù)et方法的覆蓋型描述符

>>> m.over_no_get #沒有__get__方法,所以返回描述符實例

>>> Managed.over_no_get #直接從托管類Managed中讀取描述符實例也是如此

>>> m.over_no_get = 7  #設(shè)置值時出發(fā)__set__方法
-> OverridingNoGet.__set__(,,7))
>>> m.__dict__["over_no_get"] = 7 #通過實例的__dict__屬性設(shè)置名為over_no_get的實例屬性
>>> m.over_no_get #現(xiàn)在,實例屬性會覆蓋描述符,因為沒有定義__get__方法
7
>>> m.over_no_get = 7  #設(shè)置屬性值時還是會觸發(fā)描述符的__set__方法
-> OverridingNoGet.__set__(,,7))

非覆蓋型描述符,也叫非數(shù)據(jù)描述符

>>> m.non_over  #出發(fā)描述符的__get__方法
-> NonOverriding.__get__(,,))
>>> m.non_over = 7 #沒有__set__方法,所以沒有干涉賦值操作。這里設(shè)置的是實例屬性
>>> m.non_over #實例屬性會覆蓋描述符的__get__方法
7
>>> m.__dict__
{"non_over": 7}
>>> Managed.non_over  #類的描述符依然存在
-> NonOverriding.__get__(,None,))
>>> del m.non_over #刪除實例屬性
>>> m.__dict__
{}
>>> m.non_over #再讀取m.non_over時就會出發(fā)描述符的__get__方法
-> NonOverriding.__get__(,,))


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

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/43849.html

相關(guān)文章

  • Bottle框架中裝飾器類和描述應(yīng)用

    摘要:最近在閱讀微型框架的源碼,發(fā)現(xiàn)了中有一個既是裝飾器類又是描述符的有趣實現(xiàn)。所以第三版的代碼可以這樣寫第三版的代碼沒有使用裝飾器,而是使用了描述符這個技巧。更大的問題來自如何將描述符與裝飾器結(jié)合起來,因為是一個類而不是方法。 最近在閱讀Python微型Web框架Bottle的源碼,發(fā)現(xiàn)了Bottle中有一個既是裝飾器類又是描述符的有趣實現(xiàn)。剛好這兩個點是Python比較的難理解,又混合在...

    Panda 評論0 收藏0
  • Python屬性描述

    摘要:下面我們用描述符來實現(xiàn)中的動態(tài)屬性和特性中提及的訂單結(jié)算代碼第四版使用描述符實現(xiàn)訂單結(jié)算功能描述符基于協(xié)議實現(xiàn),無需創(chuàng)建子類。特性是覆蓋型描述符。非覆蓋型描述符沒有實現(xiàn)方法的描述符屬于非覆蓋型描述符。類中定義的方法是非覆蓋型描述符。 導(dǎo)語:本文章記錄了本人在學(xué)習(xí)Python基礎(chǔ)之元編程篇的重點知識及個人心得,打算入門Python的朋友們可以來一起學(xué)習(xí)并交流。 本文重點: 1、了解描述符...

    geekzhou 評論0 收藏0
  • python 描述解析

    摘要:之所以是這樣是因為當(dāng)訪問一個實例描述符對象時,會將轉(zhuǎn)換為。而類的字典中則有描述符對象。這主要就是因為描述符優(yōu)先。此外,非數(shù)據(jù)描述符的優(yōu)先級低于實例屬性。參考以上就是本人對描述符的一些理解,有什么不正確的地方還請不吝指出,謝謝 什么是描述符 python描述符是一個綁定行為的對象屬性,在描述符協(xié)議中,它可以通過方法重寫屬性的訪問。這些方法有 __get__(), __set__(), 和...

    rozbo 評論0 收藏0
  • 90 % Python 開發(fā)者不知道描述應(yīng)用

    摘要:由上面的注釋,可以看出其實就相當(dāng)于一個描述符類,而在此刻變成了一個描述符。調(diào)用這個方法可以知道,每調(diào)用一次,它都會經(jīng)過描述符類的?;诿枋龇绾螌崿F(xiàn)同樣的也是一樣。我想你應(yīng)該對描述符在中的應(yīng)用有了更深的理解。好吧,我承認(rèn)我標(biāo)題黨了。但是這篇文章的知識點,你有極大的可能并不知道。 前段時間,我寫了一篇描述符的入門級文章,從那些文章里你知道了如何定義描述符,且明白了描述符是如何工作的。 如果你還...

    番茄西紅柿 評論0 收藏0

發(fā)表評論

0條評論

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