特定のクラスのすべてのメソッドに staticmethod を適用する方法はありますか?
そのメタクラス (メタクラスのnew ) でメソッドにアクセスして staticmethod を適用できると思っていましたが、構文を認識していません。誰でもこれに光を当てることができますか?
特定のクラスのすべてのメソッドに staticmethod を適用する方法はありますか?
そのメタクラス (メタクラスのnew ) でメソッドにアクセスして staticmethod を適用できると思っていましたが、構文を認識していません。誰でもこれに光を当てることができますか?
どのメソッドも状態を共有しない場合、クラスを作成する理由はほとんどありません。関数を備えたモジュールは、おそらくより良いアイデアです...
モジュール(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
です(たとえば、これは編集者の検査に失敗します)。この答えは、非常に単純な実装であるため、それが可能であることを示すために提供されています。
mgilson の答えが最適ですが、クラスを名前空間として定義するためによく使用される別のパターンを追加するには、クラスをインスタンス化して、クラス名を上書きすることもできます。
class Test:
def a_static_method(self, arg1, srg2):
pass
Test = Test()
ただし、この後Test
は実際にはクラス インスタンスであり、使用方法によっては誤解を招く可能性があることに注意してください。