我想做以下事项:
我有一个类,该类有一个名为 cmds 的字典。我想通过装饰器动态添加元素。装饰者应该是一个函数,这个类的方法
关于我想要的示例代码:
class Foo(object):
#In a class:
@cmd("exit")
def cmd_exit(self, *args):
self.run=0
print("Exiting mainloop...")
@cmd('reconnect')
def cmd_reconnect(self):
self.connect(self._host)
为了实现这一点,我需要将self传递给方法cmd
,这是一个装饰器。但是,cmd
未收到self
那我怎么能这样呢?
修改
我的Foo.cmd
方法具有以下定义:
def cmd(self, name):
def decorator(funcs):
fname=name if name else funcs.__name__
self.cmds[fname]=funcs
self.cmdLogger.info("Registrated function %s", name)
return
return decorator
它只接收我传递给装饰器的字符串(例如“exit”和“reconnect”)
请注意,内部装饰器(称为装饰器)返回None
,因此调用装饰器的原始函数被“移除”。
答案 0 :(得分:1)
您可以从其他类继承'cmds',以便在“中心位置”跟踪您的日志:
from functools import wraps
def cmd(*name):
def wrapper(fn):
@wraps(fn)
def real_decorator(*args, **kw):
fname = name[0] if name else fn.__name__
cls = args[0]
cls.cmds[fname]=fn
#self.cmdLogger.info("Registrated function %s", name)
return fn(*args,**kw)
return real_decorator
return wrapper
class Logger(object):
def __init__(self):
self.cmds = {}
#self.cmdLogger = ...
class Foo(Logger):
@cmd("exit")
def cmd_exit(self, *args):
self.run=0
print("Exiting mainloop...")
@cmd('reconnect')
def cmd_reconnect(self):
self.connect(self._host)
f = Foo()
f.cmd_exit()
print(f.cmds)
返回:
Exiting mainloop...
{'exit': <function Foo.cmd_exit at 0x7fb11cfee048>}