web-dev-qa-db-ja.com

クラスとそのメソッド内での自己パラメーター、@ staticmethodキーワードの使用方法

pythonクラスに複数のメソッドがあります。@staticmethodインスタンスを使用してメソッドを定義し、メイン関数内からクラスの他のメソッドを呼び出したい(main_function)。メイン関数から他の関数​​を呼び出すにはselfパラメータが必要だと思います。クラスのインスタンスを作成するときに、このパラメータをmain_functionに渡したいと思います。

class myclass:
  @staticmethod
  def function1(param1)
      print "function1"
  @staticmethod
  def main_function(self, param1)
     function1(param1)

my_object = myclass()
my_object.main_function(param1)

私はこのエラーを受け取りました:

TypeError: main_function() takes exactly 2 arguments (1 given)

問題は、インスタンスを作成するときにselfパラメータがないことです。メソッド定義から@staticmethodキーワードを削除して、すべてのselfパラメータを削除しようとしましたが、これは機能しません。

7
Stateless

通常、特定のクラスに結び付けたいが他のコンテキストは必要ない関数を作成している場合にのみ、_@staticmethod_を使用します。たとえば、 str.maketrans() function は静的メソッドです。これは、文字列を操作するときによく使用するユーティリティ関数であり、既存のstrタイプ(これはクラスとして事前に存在します)は意味があります。

代わりにクラスをnamespaceとして使用しているようです。しないでください。関数にモジュールを使用すれば、クラスに適用される特別なスコープ規則について心配する必要はありません。 statefunctionalityをバンドルする必要がある場合にのみ、クラスを使用してください。

静的メソッドanywayでクラスを使用することを主張する場合、どこでもクラス名をハードコーディングする必要があります。

_class myclass:
    @staticmethod
    def function1(param1)
        print "function1"

    @staticmethod
    def main_function(param1)
        # Want to use other functions in this class? Then you will
        # have to use the full name of the class as a prefix:
        myclass.function1(param1)
_

代わりにclassmethodsを使用して、クラスオブジェクトへの参照を取得できます。

_class myclass:
    @staticmethod
    def function1(param1)
        print "function1"

    @classmethod
    def main_function(cls, param1)
        # Now you can use the `cls` reference to access other attributes
        cls.function1(param1)
_

これには、継承を使用できるという追加の利点があります。

ただし、モジュールの使用は、一連の関数を名前空間に編成する正しい方法です。すべてをパッケージの_my_module.py_ファイルに入れ、インポートを使用します。

_import my_module

my_module.main_function(param1)
_

My_moduleのすべてのグローバルが1つのモジュールオブジェクトにバンドルされ、接頭辞やcls参照は必要なくなりました。

23
Martijn Pieters