反思类的属性,如果它是装饰,而无需访问属性值

问题描述:

以下是我处理的简化版本:反思类的属性,如果它是装饰,而无需访问属性值

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') 
+0

虽然黑客通过它,我几乎到了那里。我尽可能设置'wrapper._mydecorator = True',但我无法弄清楚如何找到该属性。这让我一直在那里。非常感谢! – elethan