Python 将 class 实例传递给它的方法(函数)装饰器
Python pass class instance to its method (function) decorators
我想执行以下操作:
我有一个 class,那个 class 有一个名为 cmds 的字典。我想通过装饰器动态地向它添加元素。装饰器应该是一个函数,一个this class.
的方法
我想要的示例代码:
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')
注意内部装饰器(称为decorator)returnsNone
,所以调用装饰器的原始函数是"removed".
您可以从另一个 class 继承 'cmds',以跟踪您在 'central place' 中的日志:
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)
Returns:
Exiting mainloop...
{'exit': <function Foo.cmd_exit at 0x7fb11cfee048>}
我想执行以下操作:
我有一个 class,那个 class 有一个名为 cmds 的字典。我想通过装饰器动态地向它添加元素。装饰器应该是一个函数,一个this class.
的方法
我想要的示例代码:
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')
注意内部装饰器(称为decorator)returnsNone
,所以调用装饰器的原始函数是"removed".
您可以从另一个 class 继承 'cmds',以跟踪您在 'central place' 中的日志:
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)
Returns:
Exiting mainloop...
{'exit': <function Foo.cmd_exit at 0x7fb11cfee048>}