亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

python的描述符(descriptor)、裝飾器(property)造成

系統(tǒng) 1921 0

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

復制代碼 代碼如下:

# 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


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

__getattr__: v
This is a test.

但是注意,如果把
復制代碼 代碼如下:

#??????? raise AttributeError("test")


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

復制代碼 代碼如下:

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)這樣的文字:

復制代碼 代碼如下:

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.

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

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


更多文章、技術(shù)交流、商務合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 亚洲精品国产第一综合99久久 | 91香蕉网站| 奇米色视频| h在线免费视频 | 手机看片日韩高清国产欧美 | 日本高清免费视频不卡a | 12至16末成年毛片 | 久久国产精品影院 | 在线久草视频 | 色婷婷99综合久久久精品 | 亚洲水蜜桃久久综合网站 | 久久青草免费91观看 | 亚洲欧美国产高清va在线播放 | 国产波波社区精品视频 | 伊人国产精品 | 全免费a级毛片免费看视频免 | 免费一级毛片在线播放 | 一区二区三区在线免费观看视频 | 成人激情视频在线 | 奇米色网 | 男人的天堂欧美精品色偷偷 | 天天干天天爽 | 亚洲乱码在线播放 | 国产不卡在线观看 | 四虎永久免费紧急入口 | 九九热视频在线 | 97久久影院 | 亚洲激情在线观看 | 欧美色视频超清在线观看 | 日本高清视频一区二区三区 | 99热成人精品国产免国语的 | 激情影院免费 | 欧美大片日韩精品四虎影视 | 日韩一区二区免费看 | 国产精品久久久久久久成人午夜 | 久久亚洲综合网 | 色最快国产 | 国产亚洲精品一区二区在线观看 | 亚洲精品国产一区二区图片欧美 | 久久99影院 | 国产一区二区不卡免费观在线 |