正如标题所述,我正在寻找一种修饰类的方法,这样当我调用方法时,装饰器就会应用于该调用。这背后的主要原因是允许我捕获函数调用及其传递的参数。我不会沿着装饰单个方法的传统道路走下去的原因是,这些方法可能不会提前知道,因为这些类将通过插件进行扩展。我也对人们可能遇到这个问题的其他实现持开放态度。
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‘
先谢谢你...
发布于 2015-12-12 09:39:49
如果你不喜欢元类,你可以使用类装饰器:
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")如果这是针对插件系统的,那么具有自定义元类的基类在将来可能会更具可扩展性,并且允许您拥有需要覆盖的自定义抽象方法,等等。
https://stackoverflow.com/questions/34228854
复制相似问题