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

python的描述符(descriptor)、裝飾器(property)造成的一個無限遞歸問題分享

 更新時間:2014年07月09日 09:53:56   投稿:junjie  
這篇文章主要介紹了python的描述符(descriptor)、裝飾器(property)造成的一個無限遞歸問題分享,一個不太會遇到的問題,需要的朋友可以參考下

分享一下剛遇到的一個小問題,我有一段類似于這樣的python代碼:

復(fù)制代碼 代碼如下:

# coding: utf-8

class A(object):

    @property
    def _value(self):
#        raise AttributeError("test")
        return {"v": "This is a test."}

    def __getattr__(self, key):
        print "__getattr__:", key
        return self._value[key]

if __name__ == '__main__':
    a = A()
    print a.v


運(yùn)行后可以得到正確的結(jié)果
復(fù)制代碼 代碼如下:

__getattr__: v
This is a test.

但是注意,如果把
復(fù)制代碼 代碼如下:

#        raise AttributeError("test")


這行的注釋去掉的話,即在_value方法里面拋出AttributeError異常,事情就會變得有些奇怪。程序運(yùn)行的時候并不會拋出異常,而是會進(jìn)入一個無限遞歸:

復(fù)制代碼 代碼如下:

File "attr_test.py", line 12, in __getattr__
    return self._value[key]
  File "attr_test.py", line 12, in __getattr__
    return self._value[key]
RuntimeError: maximum recursion depth exceeded while calling a Python object

通過多方查找后發(fā)現(xiàn)是property裝飾器的問題,property實際上是一個descriptor。在python doc中可以發(fā)現(xiàn)這樣的文字:

復(fù)制代碼 代碼如下:

object.__get__(self, instance, owner)

Called to get the attribute of the owner class (class attribute access) or of an instance of that class (instance attribute access). owner is always the owner class, while instance is the instance that the attribute was accessed through, or None when the attribute is accessed through the owner. This method should return the (computed) attribute value or raise an AttributeError exception.

這樣當(dāng)用戶訪問._value時,拋出了AttributeError從而調(diào)用了__getattr__方法去嘗試獲取。這樣程序就變成了無限遞歸。

這個問題看上去不復(fù)雜,但是當(dāng)你的_value方法是比較隱晦的拋出AttributeError的話,調(diào)試起來就會比較困難了。

相關(guān)文章

  • 淺談Python中函數(shù)的參數(shù)傳遞

    淺談Python中函數(shù)的參數(shù)傳遞

    下面小編就為大家?guī)硪黄獪\談Python中函數(shù)的參數(shù)傳遞。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-06-06
  • 利用python實現(xiàn)平穩(wěn)時間序列的建模方式

    利用python實現(xiàn)平穩(wěn)時間序列的建模方式

    這篇文章主要介紹了利用python實現(xiàn)平穩(wěn)時間序列的建模方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-06-06
  • python調(diào)用新浪微博API項目實踐

    python調(diào)用新浪微博API項目實踐

    因為最近接觸到調(diào)用新浪微博開放接口的項目,所以就想試試用python調(diào)用微博API,需要的朋友可以參考下
    2014-07-07
  • python編輯用戶登入界面的實現(xiàn)代碼

    python編輯用戶登入界面的實現(xiàn)代碼

    這篇文章主要介紹了python編輯用戶登入界面的實現(xiàn)代碼,非常不錯,代碼簡單易懂,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-07-07
  • Python自動化中三種等待時間方式

    Python自動化中三種等待時間方式

    這篇文章主要介紹了Python自動化中三種等待時間方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • Pytest+Request+Allure+Jenkins實現(xiàn)接口自動化

    Pytest+Request+Allure+Jenkins實現(xiàn)接口自動化

    這篇文章介紹了Pytest+Request+Allure+Jenkins實現(xiàn)接口自動化的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • Python中優(yōu)雅地處理JSON5文件的方法詳解

    Python中優(yōu)雅地處理JSON5文件的方法詳解

    JSON5 是 JSON 的一個超集,通過引入部分 ECMAScript 5.1 的特性來擴(kuò)展 JSON 的語法,以減少 JSON 格式的某些限制,同時,保持兼容現(xiàn)有的 JSON 格式,本文給大家介紹了Python中如何優(yōu)雅地處理 JSON5 文件,需要的朋友可以參考下
    2024-04-04
  • python生成驗證碼圖片代碼分享

    python生成驗證碼圖片代碼分享

    這篇文章主要為大家介紹了python生成驗證碼圖片代碼,生成原理是將一串隨機(jī)產(chǎn)生的數(shù)字或符號,生成一幅圖片,圖片里加上一些干擾象素,想要實現(xiàn)驗證碼圖片的朋友可以參考一下
    2016-01-01
  • 最強(qiáng)Python可視化繪圖庫Plotly詳解用法

    最強(qiáng)Python可視化繪圖庫Plotly詳解用法

    數(shù)據(jù)分析離不開數(shù)據(jù)可視化。Plotly 是一款用來做數(shù)據(jù)分析和可視化的在線平臺,功能非常強(qiáng)大,可以在線繪制很多圖形比如條形圖、散點(diǎn)圖、餅圖、直方圖等等
    2021-11-11
  • python 利用turtle模塊畫出沒有角的方格

    python 利用turtle模塊畫出沒有角的方格

    今天小編就為大家分享一篇python 利用turtle模塊畫出沒有角的方格,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-11-11

最新評論

莱州市| 武平县| 昌平区| 闽侯县| 瑞安市| 万盛区| 偏关县| 衡东县| 曲麻莱县| 仁怀市| 余姚市| 清丰县| 施秉县| 正宁县| 温泉县| 五家渠市| 五家渠市| 柳江县| 迭部县| 政和县| 临泉县| 句容市| 德格县| 凤城市| 重庆市| 兴隆县| 大冶市| 徐闻县| 阿克苏市| 阿克陶县| 新疆| 鄄城县| 黔江区| 贵阳市| 湘乡市| 宣威市| 库伦旗| 巢湖市| 五寨县| 综艺| 喀喇|