使用装饰器来收集实例方法?

时间:2014-09-03 02:26:59

标签: python

我有这堂课:

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]

这可能吗?

2 个答案:

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