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


95

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

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番目の質問への回答はすでにあります。私がすでに持っている回答に対して別の質問を開く必要があると思われる場合は、plzで教えてください。


3
@pablo:質問の本質を変更することはできません!! この質問を終了して、別の質問を開始してください!!
jldupont 2009

わかった、わかった。質問を削除するということですか?答えはピーターハンセンのコメントにすでにあります
Pablo

@pablo:あなたの質問への回答を提供してくれたすべての人にとって丁寧ではない、ここでは削除できません。回答を受け入れ、新しい質問作成する必要があります。
jldupont 2009

1
@pablo:明確にするために:元の質問の定式化に対する回答を受け入れる必要があります。心配しないで、あなたはここであなたの方法を学びます。乾杯:-)
jldupont 2009

回答:


77

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()

16
ここにアドバイスを追加する必要があります。classmethodにはstaticmethodに比べて欠点がないことは明らかです。classmethodsを使用すると、メソッドを拡張して他のクラスメソッドを呼び出すことができます。したがって、緊急の必要がない場合でも、常に優先する必要があります。
u0b34a0f6ae 2009

1
@ u0b34a0f6ae:何か良いことをしているのかどうかはわかりませんが、クラス内にデコレータを定義しました。デコレータは「クラスメソッド」ではなく「静的メソッド」でなければなりませんでした。
アンドレ・カルダス

@ u0b34a0f6aeクラスメソッドは常にスレッドセーフですか?私の使用例では、スレッドセーフではない可能性があるクラスへの偶発的なアクセスを防ぐために、スレッドで静的メソッドを使用しています。
aquavitae 14年

@ u0b34a0f6aeは常に少し強いです。たとえば、PySpark静的メソッドを使用すると、rddジョブで使用できますが、クラスメソッドでは使用できません。
Laurens Koppenol

134

同じクラスの別の静的メソッドから静的メソッドを呼び出すには、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()

呼び出しTest.static_method_to_call()は、このクラスの他の非静的メソッドおよび非クラスメソッドからも機能するはずですよね?(...そしておそらく他のクラスも?)
gr4nt3d

はい、Test.static_method_to_call()どこからでも機能します。
warvariuc

11

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

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

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

静的メソッドの場合:

test.dosomethingelse()

クラスメソッドの場合:

cls.dosomethingelse()

1
cls.dosomethingelse()クラス定義内からのみ使用できます。
jldupont 2009

3
より正確にはcls.dosomethingelse()、クラスメソッド内からのみ使用できます。同様selfに、インスタンスメソッド自体からのみ使用できます。
Jason Baker、

1
すみません、質問を間違えて書きました。おっとっと!。「同じクラスの別の静的メソッドからインスタンスメソッドを呼び出すためにPythonで行う必要がある方法」ではなく、「同じクラスの別の静的メソッドから静的メソッドを呼び出すためにPythonで行う必要がある方法」を記述したかったクラス」
Pablo

@pablo:この場合、別の質問を書いてこれを完了する必要があります。
jldupont 2009

@jldupont、私はすでに答えを持っていますが、1つのコメントで。受け入れられないのでどうすればいいのでしょうか?
Pablo、

4

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

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

0

あなたは静的メソッドから非静的メソッドを呼び出すことはできませんが、静的メソッド内にインスタンスを作成することによって...それはそのように機能するはずです

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()

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


3
IMOこのアプローチは@classmethod、メソッドを宣言するためだけに使用する場合よりも著しく劣っており、cls.dosomethingelse()内部で使用する場合cls.dosomething()-パフォーマンス(静的メソッドにアクセスするためだけにオブジェクトをインスタンス化する)と読みやすさ(それは簡単ではありません。パターンのボイラープレートになったため、コードベース全体を単なる人間が解析するのが非常に困難になる可能性があります)
カイルワイルド

私がSOのどこかで読んだように、メソッドを呼び出すためにインスタンスを直接初期化する代わりに、それを呼び出すだけで済みます-それ自体が初期化されます。
ナキロン2013年

0

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

正しい答えは問題のコードのユースケースに依存するため;)お楽しみください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.