web-dev-qa-db-ja.com

Python静的メソッド-別のメソッドからメソッドを呼び出す方法

クラス内の別のメソッドを呼び出すための通常のメソッドがある場合、これを行う必要があります

class test:
    def __init__(self):
        pass
    def dosomething(self):
        print "do something"
        self.dosomethingelse()
    def dosomethingelse(self):
        print "do something else"

しかし、静的メソッドがある場合、私は書くことができません

self.dosomethingelse()

インスタンスがないためです。同じクラスの別の静的メソッドから静的メソッドを呼び出すには、Pythonで何をしなければなりませんか?

編集:なんて混乱。質問を編集して元の質問に戻しました。 Peter Hansenのコメントにある2番目の質問に対する答えはすでにあります。私がすでに持っている答えのために私が別の質問を開くべきだと思うなら、私に教えてください。

74
Pablo

class.method動作するはずです。

class SomeClass:
  @classmethod
  def some_class_method(cls):
    pass

  @staticmethod
  def some_static_method():
    pass

SomeClass.some_class_method()
SomeClass.some_static_method()
69
jldupont

同じクラスの別の静的メソッドから静的メソッドを呼び出すには、Pythonで何をしなければなりませんか?

class Test() :
    @staticmethod
    def static_method_to_call()
        pass

    @staticmethod
    def another_static_method() :
        Test.static_method_to_call()

    @classmethod
    def another_class_method(cls) :
        cls.static_method_to_call()
101
warvariuc

注-質問が一部変更されたようです。静的メソッドからインスタンスメソッドを呼び出す方法の質問に対する答えは、インスタンスを引数として渡すか、静的メソッド内でそのインスタンスをインスタンス化せずにできないということです。

以下は、主に「別の静的メソッドから静的メソッドを呼び出す方法」に答えることです。

is Pythonの静的メソッドとクラスメソッドの違いがあることに注意してください。静的メソッドは暗黙の最初の引数を取りませんが、クラスメソッドは暗黙の最初の引数としてクラスを取ります(通常、慣例によりcls)。それを念頭に置いて、次のようにします。

静的メソッドの場合:

test.dosomethingelse()

クラスメソッドの場合:

cls.dosomethingelse()
8
Jason Baker

クラスメソッドと静的メソッドの主な違いは次のとおりです。

  • クラスメソッドには独自のIDがあるため、INSTANCE内から呼び出す必要があります。
  • 一方、静的メソッドは複数のインスタンス間で共有できるため、クラス内から呼び出す必要があります
5
Ahmad Dwaik

静的メソッドから非静的メソッドを呼び出すことはできませんが、静的メソッド内にインスタンスを作成することで...

class test2(object):
    def __init__(self):
        pass

    @staticmethod
    def dosomething():
        print "do something"
        #creating an instance to be able to call dosomethingelse(),or you may use any existing instace
        a=test2()
        a.dosomethingelse()

    def dosomethingelse(self):
        print "do something else"

test2.dosomething()

それがあなたを助けることを願っています:)

1
Ahmad Dwaik

これらがクラスやインスタンスに依存しない場合、なぜそれらを関数にしないのですか?これは明らかな解決策のように思えます。もちろん、サブクラスなどを上書きする必要があると思わない限り、そうであれば、前の答えが最善策です。指が交差した私は、誰かのニーズに合うかもしれないし、そうでないかもしれない代替ソリューションを提供するためだけにマークダウンされません。

正解は問題のコードのユースケースに依存するため、;)

0
AppHandwerker