【发布时间】:2016-03-17 16:19:23
【问题描述】:
正如标题所述,我正在寻找一种装饰类的方法,这样当我调用方法时,装饰器就会应用于该调用。这背后的主要原因将允许我捕获函数调用及其传递的参数。我不走传统装饰单个方法的原因是因为这些方法可能不会提前知道,因为这些类将通过插件扩展。我也对人们可能的其他实现持开放态度不得不解决这个问题。
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']
提前谢谢...
【问题讨论】:
-
为什么是装饰器?为什么不能使用元类?
-
我也在考虑这个问题,我只是认为装饰器会提供更干净的外观。
标签: python python-3.x metaprogramming python-decorators