如何self
使用 a 修改变量decorator
?
前任。
class Foo:
def __init__(self,a):
self.a = a
self.li = []
def afunction(self):
pass
我想将函数对象添加afunction
到列表中self.li
,以便可以在列表中调用它。前任。有一个类定义的函数列表。我该怎么做?
谢谢
如何self
使用 a 修改变量decorator
?
前任。
class Foo:
def __init__(self,a):
self.a = a
self.li = []
def afunction(self):
pass
我想将函数对象添加afunction
到列表中self.li
,以便可以在列表中调用它。前任。有一个类定义的函数列表。我该怎么做?
谢谢
我认为你不需要装饰师。函数是 Python 中的一等对象:
class Foo:
def __init__(self,a):
self.a = a
self.li = [self.afunction]
def afunction(self):
pass
如果您的意图是将类的某些函数标记为特殊类型,以便以后可以将它们识别为其他目的,则可以使用装饰器,或者您可以只使用命名约定。
def marked(function):
function.marked = 1
return function
class MarkAware(object):
def run_marked(self, *args, **kwargs):
for name in dir(self):
meth = getattr(self, name)
if hasattr(meth, 'marked'):
meth(*args, **kwargs)
def foo(self):
pass
@marked
def bar(self):
pass
选择:
class NameConvention(object):
def run_batchable(self, *args, **kwargs):
for name in dir(self):
if name.startswith('batchable_'):
getattr(self, name)(*args, **kwargs)
def foo(self):
pass
def batchable_bar(self):
pass
正如 Lattyware 在对 unutbu 答案的评论中解释的那样,您不能直接执行您的要求,因为任何装饰器afunction
都将在创建类本身时运行,而不是在创建每个实例时运行。
如果您真正想要的只是“类定义的函数列表”,那么您根本不需要任何花哨的东西。只需在以下位置创建该列表__init__
:
def __init__(self, a):
self.a = a
self.li = [f for f in dir(self) if inspect.ismethod(f)]
如果您想要某些特定功能的列表,最简单的方法是方法unutbu
建议,它仍然不需要装饰器。
如果您希望装饰器仅标记“此方法应进入li
”,请参阅 sr2222 的答案。
这些都不是您要求的,但它们可能是您想要的。有几种方法可以实际使用装饰器将函数添加到self.li
,但它们都非常糟糕,您可能不想要它们。例如:
class Foo:
def __init__(self,a):
self.a = a
self.li = []
def mydecorator(f):
self.li.append(f)
return f
@mydecorator
def afunction(self):
print('a')
self.afunction = new.instancemethod(afunction, self, Foo)