59

ここでPythonのバインドされたメソッドとバインドされていないメソッドに関する最初の回答を参照すると、質問があります。

class Test:
    def method_one(self):
        print "Called method_one"
    @staticmethod
    def method_two():
        print "Called method_two"
    @staticmethod
    def method_three():
        Test.method_two()
class T2(Test):
    @staticmethod
    def method_two():
        print "T2"
a_test = Test()
a_test.method_one()
a_test.method_two()
a_test.method_three()
b_test = T2()
b_test.method_three()

出力を生成します:

Called method_one
Called method_two
Called method_two
Called method_two

Pythonで静的メソッドをオーバーライドする方法はありますか?

「T2」を出力することを期待b_test.method_three()していましたが、出力しません(代わりに「Calledmethod_two」を出力します)。

4

3 に答える 3

83

そこで使用しているフォームでは、呼び出すクラスの静的を明示的に指定していmethod_twoます。method_threeがclassmethodであり、を呼び出した場合cls.method_two、必要な結果が得られます。

class Test:
    def method_one(self):
        print "Called method_one"
    @staticmethod
    def method_two():
        print "Called method_two"
    @classmethod
    def method_three(cls):
        cls.method_two()

class T2(Test):
    @staticmethod
    def method_two():
        print "T2"

a_test = Test()
a_test.method_one()  # -> Called method_one
a_test.method_two()  # -> Called method_two
a_test.method_three()  # -> Called method_two

b_test = T2()
b_test.method_three()  # -> T2
Test.method_two()  # -> Called method_two
T2.method_three()  # -> T2
于 2009-05-21T13:56:59.780 に答える
3

表示される動作は、予想される動作です。静的メソッドは...静的です。method_three()で定義されたものを呼び出すと、Test確かにmethod_two()によって定義されたものが呼び出されTestます。

この適切な動作を「回避」する方法については...

最良の方法は、仮想動作が必要なときにメソッドを仮想化することです。仮想化したい静的メソッドを使用したライブラリコードで立ち往生している場合は、理由があるのか​​、それとも単なる見落としなのかを詳しく調べることができます。

method_three()それ以外の場合は、T2その呼び出しでnewを定義できますT2.method_two()

于 2009-05-21T14:00:27.353 に答える
0

さらに、インスタンスなしで「仮想静的」関数を呼び出したい場合は、次のように進めることができます。

  1. 次のように、基本クラスの関数を非静的に宣言します。

    class Base:
        def my_fun(self):
            print('my_fun base')
    
    class Derived(Base):
        def my_fun(self):
            print('my_fun derived')
    
  2. 次のように、インスタンスではないクラスタイプを渡して呼び出します。

    Derived.my_fun(Derived)
    

これは、実行時にのみ認識される変数「class_type」がある場合に役立ちます。

于 2016-06-30T09:45:09.350 に答える