python获取方法的装饰方法_在方法上获取装饰器名称的内省?

我很惊讶这个问题太老了,没有人花时间来添加实际的内省方式来完成这个任务,所以这里是:

你要检查的代码。。。def template(func):

def wrapper(*args, **kwargs):

return func(*args, **kwargs)

return wrapper

baz = template

che = template

class Foo(object):

@baz

@che

def bar(self):

pass

现在您可以用这样的东西检查上面的Foo类。。。import ast

import inspect

def get_decorators(cls):

target = cls

decorators = {}

def visit_FunctionDef(node):

decorators[node.name] = []

for n in node.decorator_list:

name = ''

if isinstance(n, ast.Call):

name = n.func.attr if isinstance(n.func, ast.Attribute) else n.func.id

else:

name = n.attr if isinstance(n, ast.Attribute) else n.id

decorators[node.name].append(name)

node_iter = ast.NodeVisitor()

node_iter.visit_FunctionDef = visit_FunctionDef

node_iter.visit(ast.parse(inspect.getsource(target)))

return decorators

print get_decorators(Foo)

上面应该印着这样的东西。。。{'bar': ['baz', 'che']}

或者至少在我用Python2.7.9进行测试的时候是这样的:)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值