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

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

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

分享一下剛遇到的一個(gè)小問題,我有一段類似于這樣的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)行的時(shí)候并不會拋出異常,而是會進(jìn)入一個(gè)無限遞歸:

復(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實(shí)際上是一個(gè)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時(shí),拋出了AttributeError從而調(diào)用了__getattr__方法去嘗試獲取。這樣程序就變成了無限遞歸。

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

相關(guān)文章

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

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

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

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

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

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

    因?yàn)樽罱佑|到調(diào)用新浪微博開放接口的項(xiàng)目,所以就想試試用python調(diào)用微博API,需要的朋友可以參考下
    2014-07-07
  • python編輯用戶登入界面的實(shí)現(xiàn)代碼

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

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

    Python自動化中三種等待時(shí)間方式

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

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

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

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

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

    python生成驗(yàn)證碼圖片代碼分享

    這篇文章主要為大家介紹了python生成驗(yàn)證碼圖片代碼,生成原理是將一串隨機(jī)產(chǎn)生的數(shù)字或符號,生成一幅圖片,圖片里加上一些干擾象素,想要實(shí)現(xiàn)驗(yà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模塊畫出沒有角的方格,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-11-11

最新評論

阿拉善右旗| 崇仁县| 漳平市| 涿鹿县| 蒲江县| 平邑县| 卢龙县| 平昌县| 平和县| 津南区| 衡阳市| 唐海县| 龙里县| 江川县| 从化市| 扶绥县| 渝北区| 镇原县| 曲沃县| 太仓市| 全椒县| 华阴市| 合山市| 仁化县| 绩溪县| 田阳县| 琼海市| 邓州市| 深泽县| 潞城市| 会宁县| 共和县| 梁平县| 宝应县| 闻喜县| 锦屏县| 固镇县| 米易县| 镇江市| 商河县| 台安县|