[英]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.