0

パッケージでは、クラス内で完全に機能する一連の関数/変数を分離しました。これらの関数は特定のコンテキストを必要としないため、クラス メソッドになりました。それらはいくつかの外部関数を使用する場合があり、ここでは関数で表されていsave_cます。しかし、次のコードを機能させることができません。

def save_c(v):
    print("c :" + v)


class Writer(object):

    @classmethod
    def save(cls, t, v):
        cls.writers[t](v)


    @classmethod
    def save_a(cls, v):
        print("a :" + v)


    @classmethod
    def save_b(cls, v):
        print("b :" + v)

    writers = [save_a, save_b, save_c]


if __name__ == "__main__":
    Writer.save(1, [1, 2, 3])

前のコードでは、次のエラーが発生します。

TypeError: 'classmethod' object is not callable

私がやろうとしていることが到達可能かどうか誰かが知っていますか? それとも、通常のメソッドを使用して、必要に応じて Writer をインスタンス化する必要がありますか?

4

3 に答える 3

1

実際、内部属性はクラス メソッドwritersの属性を参照する必要があります。__func__はい、ここでは、外部呼び出しに使用されるのと同じ署名を尊重するために、staticmethodデコレーターの代わりにデコレーターを使用する必要があります。classmethod次のコードはうまく機能します。

def save_c(v):
    print("c :" + v)


class Writer(object):

    @staticmethod
    def save(t, v):
        Writer.writers[t](str(v))


    @staticmethod
    def save_a(v):
        print("a :" + v)


    @staticmethod
    def save_b(v):
        print("b :" + v)

    writers = [save_a.__func__, save_b.__func__, save_c]


if __name__ == "__main__":
    Writer.save(0, [1, 2, 3])
    Writer.save(1, [1, 2, 3])
    Writer.save(2, [1, 2, 3])
于 2014-02-23T17:54:17.603 に答える
0

@staticmethodではなく使用するつもりだったようです@classmethod

詳細については、Python の @staticmethod と @classmethod の違いは何ですか? を参照してください。

于 2014-02-23T17:19:36.637 に答える