[英]Overriding a static method in python
這里提到關於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中的靜態方法?
我希望b_test.method_three()
打印“ T2”,但不會打印(打印“ Called method_two”)。
在此處使用的形式中,您明確指定了要調用的類的靜態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
您看到的行為是預期的行為。 靜態方法是...靜態的。 當你調用method_three()
中定義Test
一定會調用method_two()
所規定Test
。
至於如何“繞開”這種適當的行為...
最好的方法是在需要虛擬行為時將方法虛擬化。 如果您希望使用虛擬方法來處理某些帶有靜態方法的庫代碼,那么您可能會更深入地了解是否有原因或僅僅是出於疏忽。
否則,您可以在T2
中定義一個新的method_three()
,以調用T2.method_two()
。
另外,如果您想在沒有實例的情況下調用“虛擬靜態”函數,則可以這樣進行:
在基類非靜態中聲明函數,如下所示:
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”(僅在運行時才知道),這將很有用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.