覆盖python中的静态方法

时间:2009-05-21 13:47:09

标签: python static override

在这里参考关于python的绑定和未绑定方法的first answer,我有一个问题:

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中覆盖静态方法?

我希望b_test.method_three()打印“T2”,但它没有(打印“Called method_two”)。

3 个答案:

答案 0 :(得分:60)

在您使用的表单中,您明确指定要调用的类的静态method_two。如果method_three是一种类方法,并且您调用了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

答案 1 :(得分:3)

您看到的行为是预期的行为。静态方法是......静态的。当您致电method_three()中定义的Test时,它肯定会调用method_two()定义的Test

至于如何“绕开”这种正确的行为......

最好的方法是在需要虚拟行为时使方法成为虚拟方法。如果你坚持使用一些你希望是虚拟的静态方法的库代码,那么你可能会更深入地看看是否有原因,或者它是否只是一种疏忽。

否则,您可以在调用method_three()的{​​{1}}中定义新的T2

答案 2 :(得分: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)
    
  3. 注意,如果你有一个变量" class_type",这只在运行时才知道,这很有用。