簡體   English   中英

在python中獲取屬性的屬性

[英]Get attribute of a property in python

我有一個裝飾它只是緩存返回值(稱為@cached在我的例子),我想結合使用@property 這通常正常工作。 當我嘗試使用@cached添加的expire屬性時,會遇到我面臨的問題。

def cached(f):
    cache = [None]

    def inner(*args, **kwargs):
        if cache[0]:
            cache[0] = f(*args, **kwargs)
        return cache[0]

    def expire():
        cache[0] = None

    inner.expire = expire
    return inner

class Example(object):
    @property
    @cached
    def something_expensive(self):
        print("expensive")
        return "hello"


e = Example()
e.something_expensive
e.something_expensive.expire()

我如何能夠訪問到期功能? 在將其替換為@property后添加到函數中。 我了解為什么這不起作用,我對解決該問題感興趣。

一些限制:

  • 我無法在我無法控制的庫中更改@cached裝飾器
  • 我真的不希望刪除@property因為我想在單元測試中過期,它們會使我的代碼更易於使用。

我認為很糟糕的一種解決方案是(因為實際上我有很多屬性要為此執行):

class Example(object):
    @cached
    def _something_expensive(self):
        return "hello"

    @property
    def something_expensive(self):
        return self._something_expensive()

您可以使用類字典訪問它:

type(e).__dict__['something_expensive'].fget.expire()

通常, e.something_expensive等效於:

type(e).__dict__['something_expensive'].__get__(e, type(e))

有關更多詳細信息,請閱讀: 描述符方法指南

需要注意的是內expiry的功能你不設置cache從外部函數cached功能None ,你只是創建一個新的局部變量。 您可能需要執行以下操作:

def expire():
    del cache[:]
    cache.append(None)

在Python 3中,使用nonlocal關鍵字更新cache更加容易。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM