反思类的属性,如果它是装饰,而无需访问属性值
问题描述:
以下是我处理的简化版本:反思类的属性,如果它是装饰,而无需访问属性值
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'
现在我想什么,能够做的,是反思f.foo
,而没有真正访问它的价值,并检查它是否用@mydecorator
装饰。这可能吗?
用例可以在某个上下文中将某个属性列为“安全”,但在“不安全”的情况下无需实际访问它的值。
我已经看到this great post,但它似乎需要foo
已被访问。
我发现,我可以看到,这是一个property
有:
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')
虽然黑客通过它,我几乎到了那里。我尽可能设置'wrapper._mydecorator = True',但我无法弄清楚如何找到该属性。这让我一直在那里。非常感谢! – elethan