0

如何self使用 a 修改变量decorator

前任。

class Foo:
   def __init__(self,a):
       self.a = a
       self.li = []

    def afunction(self):
       pass

我想将函数对象添加afunction到列表中self.li,以便可以在列表中调用它。前任。有一个类定义的函数列表。我该怎么做?

谢谢

4

3 回答 3

3

我认为你不需要装饰师。函数是 Python 中的一等对象:

class Foo:
   def __init__(self,a):
       self.a = a
       self.li = [self.afunction]

    def afunction(self):
       pass
于 2013-01-18T23:05:25.217 回答
2

如果您的意图是将类的某些函数标记为特殊类型,以便以后可以将它们识别为其他目的,则可以使用装饰器,或者您可以只使用命名约定。

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
于 2013-01-18T23:19:32.127 回答
1

正如 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)
于 2013-01-18T23:21:50.690 回答