gpt4 book ai didi

python - 在python中获取属性的属性

转载 作者:行者123 更新时间:2023-12-01 04:26:10 26 4
gpt4 key购买 nike

我有一个装饰器,它只是缓存返回值(在我的示例中称为@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_expense 相当于:

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

有关更多详细信息,请阅读:Descriptor HowTo Guide

请注意,在 expiry 函数内部,您没有将外部函数 cached 函数中的 cache 设置为 None,您只需创建一个新的局部变量。您可能想做这样的事情:

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

在 Python 3 中,使用 nonlocal 更新缓存更加容易。关键字。

关于python - 在python中获取属性的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33117472/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com