以下是我正在处理的简化版本:
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,我相信有一种方法,但到目前为止我还没弄清楚......
答案 0 :(得分:1)
在Python中,装饰器只是一种缩短的语法。 E.g:
@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')