Introspect类属性,以查看它是否已装饰,无需访问属性值

时间:2017-06-28 02:38:50

标签: python introspection python-decorators

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

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 个答案:

答案 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')