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
パラメータを削除しようとしましたが、これは機能しません。
通常、特定のクラスに結び付けたいが他のコンテキストは必要ない関数を作成している場合にのみ、_@staticmethod
_を使用します。たとえば、 str.maketrans()
function は静的メソッドです。これは、文字列を操作するときによく使用するユーティリティ関数であり、既存のstr
タイプ(これはクラスとして事前に存在します)は意味があります。
代わりにクラスをnamespaceとして使用しているようです。しないでください。関数にモジュールを使用すれば、クラスに適用される特別なスコープ規則について心配する必要はありません。 stateとfunctionalityをバンドルする必要がある場合にのみ、クラスを使用してください。
静的メソッド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
参照は必要なくなりました。