gpt4 book ai didi

python - 如何在类实例方法装饰器上使用类属性?

转载 作者:太空狗 更新时间:2023-10-29 20:54:05 25 4
gpt4 key购买 nike

我有一些类看起来像这样:

class Foo:
bar = None

@baz(frob=bar)
def oof():
pass

class Rab(Foo):
bar = 'zab'

我无法控制 @baz 装饰器,我需要使用新类 Rab 的类属性 bar .但是调用 Rab.oof() 使用的是基类的 bar=None

最佳答案

所以这是一种奇怪/有趣的方法,您只需要修改 Foo,这里的想法是创建一个新的装饰器来延迟 baz 装饰直到第一次使用基于类名的缓存调用该函数,以便它只发生一次。

请注意,这还包括 baz 的虚拟实现,它只打印提供的 frob 参数,但这种方法应该可以正常工作而无需修改 巴兹:

def baz(frob):
def deco(func):
def wrapped(*args, **kwargs):
print('frob:', frob)
return func(*args, **kwargs)
return wrapped
return deco

def newdeco(func):
def wrapped(self, *args, **kwargs):
if not hasattr(wrapped, 'cache'):
wrapped.cache = {}
cls = self.__class__.__name__
if cls not in wrapped.cache:
wrapped.cache[cls] = baz(frob=getattr(self.__class__, 'bar'))(func)
wrapped.cache[cls](self, *args, **kwargs)
return wrapped

class Foo:
bar = None

@newdeco
def oof(self):
pass

class Rab(Foo):
bar = 'zab'


f = Foo()
f.oof()

r = Rab()
r.oof()

我还必须向 oof 添加一个 self 参数,前提是 oof 是一个方法,如果 baz 还将函数转换为静态方法,我不确定这种方法是否有效。

关于python - 如何在类实例方法装饰器上使用类属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24416723/

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