gpt4 book ai didi

python - 内省(introspection)类属性以查看它是否被修饰,而不访问属性值

转载 作者:太空宇宙 更新时间:2023-11-03 15:04:20 26 4
gpt4 key购买 nike

这是我正在处理的简化版本:

def mydecorator(prop):
def wrapper(self_arg):
return prop(self_arg) + 'bar'
return wrapper

class Foo(object):

def __init__(self):
self.value = 'foo'

@property
@mydecorator
def foo(self):
return self.value

@property
def doesnt_have_my_decorator(self):
return 'something that requires a lot of computation'

f = Foo()

print f.foo # prints 'foobar'

现在我想做的是内省(introspection) f.foo,而不实际访问它的值,并检查它是否用 @mydecorator 装饰。这可能吗?

用例是能够在特定上下文中将属性列入“安全”白名单,而无需实际访问它的值,以防它“不安全”。

我见过this great post ,但似乎该方法需要已访问 foo

我发现我可以看到它是一个属性,其中:

f.__class__.__dict__['foo'].__class__

但我还没有找到任何对 mydecorator 的引用。既然是Python,我确信有办法,但到目前为止我还没有弄清楚......

最佳答案

在 Python 中,装饰器只是一种缩短的语法。例如:

@property
@mydecorator
def foo(self):
return self.value

与此完全相同:

def foo(self):
return self.value

foo = property (mydecorator (foo))

由于您的装饰器在其返回值上没有留下任何可检测的痕迹,因此无法确定它是否已应用。您可以重写为例如:

def mydecorator(prop):
def wrapper(self_arg):
return prop(self_arg) + 'bar'
wrapper._mydecorator = True
return wrapper

然后使用这个表达式来测试它:

hasattr (type (f).foo.fget, '_mydecorator')

关于python - 内省(introspection)类属性以查看它是否被修饰,而不访问属性值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44792769/

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