2009-05-21 30 views
38

Nhắc đến first answer về các phương pháp ràng buộc và không ràng buộc trăn ở đây, tôi có một câu hỏi:Trọng một phương pháp tĩnh trong 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() 

sản xuất đầu ra:

Called method_one 
Called method_two 
Called method_two 
Called method_two 

Có cách nào để ghi đè lên một phương pháp tĩnh trong python?

Tôi mong đợi b_test.method_three() để in "T2", nhưng không (in "Called method_two" thay thế).

Trả lời

49

Trong biểu mẫu bạn đang sử dụng ở đó, bạn đang chỉ định rõ ràng lớp nào là method_two tĩnh để gọi. Nếu method_three là một classmethod, và bạn gọi cls.method_two, bạn sẽ nhận được kết quả mà bạn muốn:

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 
+0

Cảm ơn rất nhiều! Đây là những gì tôi muốn. – Emma

+3

Thực sự hữu ích. Trong trường hợp của tôi, tôi cần truy cập vào lớp của một cá thể. Tôi đã làm nó như thế này: 'dụ .__ lớp __. My_method()' – Caumons

3

Các hành vi mà bạn nhìn thấy là hành vi mong đợi. Các phương thức tĩnh là ... tĩnh. Khi bạn gọi method_three() được xác định trong Test, nó chắc chắn sẽ gọi method_two() được xác định bởi Test.

Đối với làm thế nào để "có được xung quanh" hành vi đúng đắn này ...

Cách tốt nhất là làm cho phương pháp ảo khi bạn muốn hành vi ảo. Nếu bạn đang mắc kẹt với một số mã thư viện với một phương pháp tĩnh mà bạn muốn là ảo thì bạn có thể nhìn sâu hơn để xem nếu có một lý do hoặc nếu nó chỉ là một giám sát.

Nếu không, bạn có thể xác định method_three() mới trong T2 gọi T2.method_two().

0

Ngoài ra, nếu bạn muốn gọi là "ảo tĩnh" chức năng mà không có một ví dụ, bạn có thể tiến hành như sau:

  1. Khai báo các chức năng trong các lớp cơ sở không tĩnh như vậy:

    class Base: 
        def my_fun(self): 
         print('my_fun base') 
    
    class Derived(Base): 
        def my_fun(self): 
         print('my_fun derived') 
    
  2. Gọi nó bằng cách thông qua các kiểu lớp, mà không phải là một ví dụ, như vậy:

    Derived.my_fun(Derived) 
    

Lưu ý, điều này rất hữu ích nếu bạn có một biến "class_type", chỉ được biết trong thời gian chạy.

+0

Tại thời điểm đó, tại sao không chỉ làm cho nó một phương pháp lớp học? Sau đó, nó có thể được ghi đè và vẫn được gọi là tĩnh (không cần phải vượt qua tham số lớp). –

Các vấn đề liên quan