我有这堂课:
class Foo(object):
handlers = []
def __init__(self):
pass
def run(self):
pass
def foo(self):
pass
def bar(self):
pass
我怎样才能实现装饰器@collect_handler
class Foo(object):
handlers = []
def __init__(self):
pass
def run(self):
pass
@collect_handler
def foo(self):
pass
@collect_handler
def bar(self):
pass
这样:
foo = Foo()
foo.handlers # [foo, bar]
这可能吗?
答案 0 :(得分:3)
class Foo(object):
handlers = []
def collect_handler(handlers):
def wrapper(func):
handlers.append(func)
return func
return wrapper
collect_handler = collect_handler(handlers)
def __init__(self):
pass
def run(self):
pass
@collect_handler
def foo(self):
pass
@collect_handler
def bar(self):
pass
foo = Foo()
print(foo.handlers)
产量
[<function foo at 0xb770d994>, <function bar at 0xb770d9cc>]
这些不是未绑定的方法;它们只是简单的功能。 (没有检查第一个参数是Foo
的实例。)但是,它们应该足够了。 (在Python3中注意,没有更多的未绑定方法;删除了未绑定方法和普通函数之间的区别。)
答案 1 :(得分:0)
不使用装饰器的另一种方法。
f = Foo()
[m for m in dir(f) if getattr(f,m).__doc__ == "COLLECT"]
以上语句使用Python中的List comprehension
dir
是一个内置函数,它将返回一个对象的所有属性
getattr
是一个内置函数,用于检索对象的属性
__doc__
是一个python变量,它保存任何python工件的docstring。
这应该是你的班级定义:
class Foo(object):
def __init__(self):
pass
def run(self):
pass
def foo(self):
"COLLECT"
pass
def bar(self):
"COLLECT"
pass