1

特定のクラスのすべてのメソッドに staticmethod を適用する方法はありますか?

そのメタクラス (メタクラスのnew ) でメソッドにアクセスして staticmethod を適用できると思っていましたが、構文を認識していません。誰でもこれに光を当てることができますか?

4

3 に答える 3

4

どのメソッドも状態を共有しない場合、クラスを作成する理由はほとんどありません。関数を備えたモジュールは、おそらくより良いアイデアです...

于 2013-02-15T16:20:43.803 に答える
3

モジュール(mgilsonによって提案された)はより良いオプションですが、これを本当にうまく使用できる場合(私は1つは考えられません)、モジュールとクラスデコレータを使用すると比較的簡単inspectです

import inspect

def staticmethods(cls):
    for name, method in inspect.getmembers(cls, inspect.ismethod):
        setattr(cls, name, staticmethod(method.__func__))
    return cls

@staticmethods
class Test:
    def test():
        print("Test")

Test.test()

クラスデコレータが行うのは、オブジェクトのメソッドをでループし、関数を元の(バインドされていない)関数inspect.getmembers()で上書きすることだけです。staticmethod()

このためにクラスでモジュールを使用することに注意してください。おそらく、この方法で各関数を手動で呼び出すだけ@staticmethodです(たとえば、これは編集者の検査に失敗します)。この答えは、非常に単純な実装であるため、それが可能であることを示すために提供されています。

于 2013-02-15T16:24:45.677 に答える
1

mgilson の答えが最適ですが、クラスを名前空間として定義するためによく使用される別のパターンを追加するには、クラスをインスタンス化して、クラス名を上書きすることもできます。

class Test:
    def a_static_method(self, arg1, srg2):
        pass

Test = Test()

ただし、この後Testは実際にはクラス インスタンスであり、使用方法によっては誤解を招く可能性があることに注意してください。

于 2013-02-15T16:41:56.210 に答える