簡體   English   中英

在python中重寫靜態方法

[英]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()

另外,如果您想在沒有實例的情況下調用“虛擬靜態”函數,則可以這樣進行:

  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”(僅在運行時才知道),這將很有用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM