0

self変数をで変更するにはどうすればよい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 に答える