[英]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.