2017-06-28 38 views
1

以下是我處理的簡化版本:反思類的屬性,如果它是裝飾,而無需訪問屬性值

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,我肯定有辦法,但到目前爲止我還沒有弄明白...

回答

1

在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