最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python中幾種屬性訪問的區(qū)別與用法詳解

 更新時(shí)間:2018年10月10日 08:37:48   作者:棲遲於一丘  
這篇文章主要給大家介紹了關(guān)于Python中幾種屬性訪問的區(qū)別和用法的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

起步

在Python中,對(duì)于一個(gè)對(duì)象的屬性訪問,我們一般采用的是點(diǎn)(.)屬性運(yùn)算符進(jìn)行操作。例如,有一個(gè)類實(shí)例對(duì)象foo,它有一個(gè)name屬性,那便可以使用foo.name對(duì)此屬性進(jìn)行訪問。一般而言,點(diǎn)(.)屬性運(yùn)算符比較直觀,也是我們經(jīng)常碰到的一種屬性訪問方式。

python的提供一系列和屬性訪問有關(guān)的特殊方法: __get__ , __getattr__ , __getattribute__ , __getitem__ 。本文闡述它們的區(qū)別和用法。

屬性的訪問機(jī)制

一般情況下,屬性訪問的默認(rèn)行為是從對(duì)象的字典中獲取,并當(dāng)獲取不到時(shí)會(huì)沿著一定的查找鏈進(jìn)行查找。例如 a.x 的查找鏈就是,從 a.__dict__['x'] ,然后是 type(a).__dict__['x'] ,再通過 type(a) 的基類開始查找。

若查找鏈都獲取不到屬性,則拋出 AttributeError 異常。

__getattr__ 方法

__getattr__函數(shù)的作用: 如果屬性查找(attribute lookup)在實(shí)例以及對(duì)應(yīng)的類中(通過__dict__)失敗, 那么會(huì)調(diào)用到類的__getattr__函數(shù), 如果沒有定義這個(gè)函數(shù),那么拋出AttributeError異常。由此可見,__getattr__一定是作用于屬性查找的最后一步,兜底。

這個(gè)方法是當(dāng)對(duì)象的屬性不存在是調(diào)用。如果通過正常的機(jī)制能找到對(duì)象屬性的話,不會(huì)調(diào)用 __getattr__ 方法。

class A:
 a = 1
 def __getattr__(self, item):
 print('__getattr__ call')
 return item

t = A()
print(t.a)
print(t.b)
# output
1
__getattr__ call
b

__getattribute__ 方法

這個(gè)方法會(huì)被無條件調(diào)用。不管屬性存不存在。如果類中還定義了 __getattr__ ,則不會(huì)調(diào)用 __getattr__() 方法,除非在 __getattribute__ 方法中顯示調(diào)用 __getattr__() 或者拋出了 AttributeError 。

class A:
 a = 1
 def __getattribute__(self, item):
 print('__getattribute__ call')
 raise AttributeError

 def __getattr__(self, item):
 print('__getattr__ call')
 return item

t = A()
print(t.a)
print(t.b)

所以一般情況下,為了保留 __getattr__ 的作用, __getattribute__() 方法中一般返回父類的同名方法:

def __getattribute__(self, item):
 return object.__getattribute__(self, item)

使用基類的方法來獲取屬性能避免在方法中出現(xiàn)無限遞歸的情況。

__get__ 方法

這個(gè)方法比較簡(jiǎn)單說明,它與前面的關(guān)系不大。

如果一個(gè)類中定義了 __get__() , __set__() 或 __delete__() 中的任何方法。則這個(gè)類的對(duì)象稱為描述符。

class Descri(object):
 def __get__(self, obj, type=None):
 print("call get")

 def __set__(self, obj, value):
 print("call set")

class A(object):
 x = Descri()

a = A()
a.__dict__['x'] = 1 # 不會(huì)調(diào)用 __get__
a.x  # 調(diào)用 __get__

如果查找的屬性是在描述符對(duì)象中,則這個(gè)描述符會(huì)覆蓋上文說的屬性訪問機(jī)制,體現(xiàn)在查找鏈的不同,而這個(gè)行文也會(huì)因?yàn)檎{(diào)用的不同而稍有不一樣:

  • 如果調(diào)用是對(duì)象實(shí)例(題目中的調(diào)用方式), a.x 則轉(zhuǎn)換為調(diào)用: 。 type(a).__dict__['x'].__get__(a, type(a))
  • 如果調(diào)用的是類屬性, A.x 則轉(zhuǎn)換為: A.__dict__['x'].__get__(None, A)
  • 其他情況見文末參考資料的文檔

__getitem__ 方法

這個(gè)調(diào)用也屬于無條件調(diào)用,這點(diǎn)與 __getattribute__ 一致。區(qū)別在于 __getitem__ 讓類實(shí)例允許 [] 運(yùn)算,可以這樣理解:

  • __getattribute__ 適用于所有 . 運(yùn)算符;
  • __getitem__ 適用于所有 [] 運(yùn)算符。
class A(object):
 a = 1

 def __getitem__(self, item):
 print('__getitem__ call')
 return item

t = A()
print(t['a'])
print(t['b'])

如果僅僅想要對(duì)象能夠通過 [] 獲取對(duì)象屬性可以簡(jiǎn)單的:

def __getitem(self, item):
 return object.__getattribute__(self, item)

總結(jié)

當(dāng)這幾個(gè)方法同時(shí)出現(xiàn)可能就會(huì)擾亂你了。我在網(wǎng)上看到一份示例還不錯(cuò),稍微改了下:

class C(object):
 a = 'abc'

 def __getattribute__(self, *args, **kwargs):
 print("__getattribute__() is called")
 return object.__getattribute__(self, *args, **kwargs)

 # return "haha"
 def __getattr__(self, name):
 print("__getattr__() is called ")
 return name + " from getattr"

 def __get__(self, instance, owner):
 print("__get__() is called", instance, owner)
 return self

 def __getitem__(self, item):
 print('__getitem__ call')
 return object.__getattribute__(self, item)

 def foo(self, x):
 print(x)

class C2(object):
 d = C()

if __name__ == '__main__':
 c = C()
 c2 = C2()
 print(c.a)
 print(c.zzzzzzzz)
 c2.d
 print(c2.d.a)
 print(c['a'])

可以結(jié)合輸出慢慢理解,這里還沒涉及繼承關(guān)系呢。總之,每個(gè)以 __ get 為前綴的方法都是獲取對(duì)象內(nèi)部數(shù)據(jù)的鉤子,名稱不一樣,用途也存在較大的差異,只有在實(shí)踐中理解它們,才能真正掌握它們的用法。

好了,以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • Django中prefetch_related()函數(shù)優(yōu)化實(shí)戰(zhàn)指南

    Django中prefetch_related()函數(shù)優(yōu)化實(shí)戰(zhàn)指南

    我們可以利用Django框架中select_related和prefetch_related函數(shù)對(duì)數(shù)據(jù)庫查詢優(yōu)化,這篇文章主要給大家介紹了關(guān)于Django中prefetch_related()函數(shù)優(yōu)化的相關(guān)資料,需要的朋友可以參考下
    2022-11-11
  • Python之site-packages目錄的位置

    Python之site-packages目錄的位置

    這篇文章主要介紹了Python之site-packages目錄的位置,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • Python字典常見操作實(shí)例小結(jié)【定義、添加、刪除、遍歷】

    Python字典常見操作實(shí)例小結(jié)【定義、添加、刪除、遍歷】

    這篇文章主要介紹了Python字典常見操作,結(jié)合實(shí)例形式總結(jié)分析了Python字典的定義、添加、刪除、遍歷等常見使用技巧與操作注意事項(xiàng),需要的朋友可以參考下
    2019-10-10
  • 解決python路徑錯(cuò)誤,運(yùn)行.py文件,找不到路徑的問題

    解決python路徑錯(cuò)誤,運(yùn)行.py文件,找不到路徑的問題

    這篇文章主要介紹了解決python路徑錯(cuò)誤,運(yùn)行.py文件,找不到路徑的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • 淺談Python 中整型對(duì)象的存儲(chǔ)問題

    淺談Python 中整型對(duì)象的存儲(chǔ)問題

    這篇文章主要介紹了淺談Python 中整型對(duì)象的存儲(chǔ)問題的相關(guān)資料,需要的朋友可以參考下
    2016-05-05
  • Python數(shù)字圖像處理基礎(chǔ)直方圖詳解

    Python數(shù)字圖像處理基礎(chǔ)直方圖詳解

    這篇文章主要介紹了Python數(shù)字圖像處理基礎(chǔ)直方圖詳解,本文對(duì)Python直方圖的定義、性質(zhì)、應(yīng)用以及Python直方圖的計(jì)算作了詳細(xì)的講解,有需要朋友可以借鑒參考下
    2021-09-09
  • Numpy數(shù)組轉(zhuǎn)置的兩種實(shí)現(xiàn)方法

    Numpy數(shù)組轉(zhuǎn)置的兩種實(shí)現(xiàn)方法

    下面小編就為大家分享一篇Numpy數(shù)組轉(zhuǎn)置的兩種實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-04-04
  • Python打包方法Pyinstaller的使用

    Python打包方法Pyinstaller的使用

    在我們完成一個(gè)Python項(xiàng)目或一個(gè)程序時(shí),希望將Python的py文件打包成在Windows系統(tǒng)下直接可以運(yùn)行的exe程序。這篇文章主要介紹了Python打包方法Pyinstaller的使用,感興趣的小伙伴們可以參考一下
    2018-10-10
  • python之NAN和INF值處理方式

    python之NAN和INF值處理方式

    這篇文章主要介紹了python之NAN和INF值處理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • python如何通過注冊(cè)表動(dòng)態(tài)管理組件

    python如何通過注冊(cè)表動(dòng)態(tài)管理組件

    使用注冊(cè)表的主要優(yōu)勢(shì)是可以在運(yùn)行時(shí)動(dòng)態(tài)創(chuàng)建對(duì)象,從而實(shí)現(xiàn)高度可配置和可擴(kuò)展的設(shè)計(jì),這篇文章主要介紹了python如何通過注冊(cè)表動(dòng)態(tài)管理組件,需要的朋友可以參考下
    2024-05-05

最新評(píng)論

商水县| 封开县| 绥芬河市| 嘉祥县| 辽阳县| 成都市| 斗六市| 保山市| 肃北| 历史| 固阳县| 米脂县| 龙门县| 永吉县| 泾川县| 广东省| 恩平市| 利津县| 龙江县| 三原县| 呼图壁县| 八宿县| 拜城县| 比如县| 三门县| 富裕县| 泸溪县| 巴东县| 紫云| 红河县| 漯河市| 尼木县| 郓城县| 海原县| 临猗县| 常德市| 安顺市| 林芝县| 高雄市| 汽车| 天等县|