繁体   English   中英

适用于方法的Python 3类装饰器

[英]Python 3 class decorator which get applied to the methods

如标题所示,我正在寻找一种装饰类的方法,这样,当我调用方法时,装饰器将应用于该调用。 这背后的主要原因是允许我捕获函数调用及其传递的参数。 我之所以没有沿用装饰单个方法的传统方式,是因为这些方法可能会通过插件扩展,因此可能不会提前知道这些方法。不得不这个问题。

from functools import wraps


def echo(fh):
    def func_wrapper(func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            ret = func(*args, **kwargs)
            if ret is None:
                ret = "empty"
            fn_calls = []
            if args:
                fn_calls.append([func.__name__, args, ret])
            elif kwargs:
                fn_calls.append([func.__name__, kwargs, ret])
            else:
                raise ArgumentError
            collector(fh, fn_calls)
        return wrapper
    return func_wrapper

因此,采用上述装饰器并将其应用于类而不是方法。

伪代码示例:

@echo(file_)
class Foo(object):
    def __init__(self):
        pass

    def bar(self, name):
        print("this is %s" % name)
-----
foo = Foo()
foo.bar("baz")

它将返回类似:['foo.bar','baz','None']

提前致谢...

如果您不喜欢元类,则可以使用类装饰器:

import functools

def _echoit(file, func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        file.write('Echoing func %s\n' % func.__name__)
        file.write('Echoing args %\n' % args)
        file.write('Echoing kwargs %s\n' % kwargs)
        return func(*args, **kwargs)
    return wrapper

def echo(file):
    def decorator(cls):
        attrs = vars(cls)
        for k in list(attrs.keys()):
             if callable(attrs[k]):
                 attrs[k] = _echoit(attrs[k], file)
        return cls
    return decorator

@echo(file_)
class Foo(object):
    def __init__(self):
        pass

    def bar(self, name):
        print("this is %s" % name)

foo = Foo()
foo.bar("baz")

如果这是为插件系统设计的,则具有自定义元类的基类可能会在将来进行扩展,并使您可以使用需要覆盖的自定义抽象方法等。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM