欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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


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

__getattr__: v
This is a test.

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

#        raise AttributeError("test")


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

復(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列表切片常用操作實例解析

    Python列表切片常用操作實例解析

    這篇文章主要介紹了Python列表切片常用操作實例解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-03-03
  • Python代理IP爬蟲的新手使用教程

    Python代理IP爬蟲的新手使用教程

    這篇文章主要給大家介紹了關(guān)于Python代理IP爬蟲的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用Python具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • python中urlparse模塊介紹與使用示例

    python中urlparse模塊介紹與使用示例

    這篇文章主要給大家介紹了關(guān)于python中urlparse模塊介紹與使用的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用python具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-11-11
  • python操作openpyxl導(dǎo)出Excel 設(shè)置單元格格式及合并處理代碼實例

    python操作openpyxl導(dǎo)出Excel 設(shè)置單元格格式及合并處理代碼實例

    這篇文章主要介紹了python操作openpyxl導(dǎo)出Excel 設(shè)置單元格格式及合并處理代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-08-08
  • python實現(xiàn)植物大戰(zhàn)僵尸游戲?qū)嵗a

    python實現(xiàn)植物大戰(zhàn)僵尸游戲?qū)嵗a

    這篇文章主要給大家介紹了關(guān)于python實現(xiàn)植物大戰(zhàn)僵尸游戲的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用python具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • Dephi逆向工具Dede導(dǎo)出函數(shù)名MAP導(dǎo)入到IDA中的實現(xiàn)方法

    Dephi逆向工具Dede導(dǎo)出函數(shù)名MAP導(dǎo)入到IDA中的實現(xiàn)方法

    這篇文章主要介紹了Dephi逆向工具Dede導(dǎo)出函數(shù)名MAP導(dǎo)入到IDA中,通過這個腳本,我們就可以把專業(yè)dephi程序分析的結(jié)果,轉(zhuǎn)移到IDA專業(yè)逆向代碼分析的平臺,實現(xiàn)聯(lián)動,需要的朋友可以參考下
    2022-08-08
  • 瀏覽器常用基本操作之python3+selenium4自動化測試(基礎(chǔ)篇3)

    瀏覽器常用基本操作之python3+selenium4自動化測試(基礎(chǔ)篇3)

    瀏覽器常用基本操作有很多種,今天給大家介紹python3+selenium4自動化測試的操作方法,是最最基礎(chǔ)的一篇,對python3 selenium4自動化測試相關(guān)知識感興趣的朋友一起看看吧
    2021-05-05
  • Python對字符串實現(xiàn)去重操作的方法示例

    Python對字符串實現(xiàn)去重操作的方法示例

    字符串去重是python中字符串操作常見的一個需求,最近在工作中就又遇到了,所以下面這篇文章主要給大家介紹了關(guān)于Python對字符串實現(xiàn)去重操作的相關(guān)資料,文中給出了詳細的介紹,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-08-08
  • python使用nb_log模塊捕獲日志的方法

    python使用nb_log模塊捕獲日志的方法

    這篇文章主要介紹了python使用nb_log模塊捕獲日志,文中給大家介紹了nb_log模塊的使用方式,本文給大家介紹的非常詳細,需要的朋友可以參考下
    2021-12-12
  • python定義變量類型

    python定義變量類型

    任何編程語言都需要處理數(shù)據(jù),比如數(shù)字、字符串、字符等,我們可以直接使用數(shù)據(jù),也可以將數(shù)據(jù)保存到變量中,方便以后使用。本文主要介紹了python定義變量類型,感興趣的可以了解一下
    2021-06-06

最新評論