在这里参考关于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”)。
答案 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)
此外,如果你想调用"虚拟静态"没有实例的函数,你可以这样继续:
在基类中声明函数是非静态的,如下所示:
class Base:
def my_fun(self):
print('my_fun base')
class Derived(Base):
def my_fun(self):
print('my_fun derived')
通过传递类型来调用它,类型不是实例,如下所示:
Derived.my_fun(Derived)
注意,如果你有一个变量" class_type",这只在运行时才知道,这很有用。