Tôi bắt đầu làm một cái gì đó hơi tương tự, về cơ bản ý tưởng đã được kiểm tra bất cứ khi nào một phương pháp trong một lớp cơ sở đã được thực hiện hay không trong một lớp phụ. Hóa ra cách tôi đã làm nó ban đầu tôi không thể phát hiện khi một lớp trung gian đã thực sự thực hiện phương pháp.
Cách giải quyết của tôi cho nó khá đơn giản; đặt phương thức thuộc tính và kiểm tra sự hiện diện của nó sau này. Dưới đây là một đơn giản hóa toàn bộ điều:
class A():
def method(self):
pass
method._orig = None # This attribute will be gone once the method is implemented
def run_method(self, *args, **kwargs):
if hasattr(self.method, '_orig'):
raise Exception('method not implemented')
self.method(*args, **kwargs)
class B(A):
pass
class C(B):
def method(self):
pass
class D(C):
pass
B().run_method() # ==> Raises Exception: method not implemented
C().run_method() # OK
D().run_method() # OK
UPDATE: Thực ra gọi method()
từ run_method()
(không phải là tinh thần?) Và có nó vượt qua tất cả các đối chưa sửa đổi để phương pháp này.
P.S .: Câu trả lời này không trả lời trực tiếp câu hỏi. IMHO có hai lý do người ta muốn biết lớp nào đã định nghĩa một phương thức; đầu tiên là trỏ các ngón tay vào một lớp trong mã gỡ lỗi (như xử lý ngoại lệ), và thứ hai là xác định xem phương thức đã được triển khai lại chưa (phương thức là một sơ đồ được thực hiện bởi lập trình viên). Câu trả lời này giải quyết trường hợp thứ hai theo một cách khác.
Nguồn
2014-10-15 20:44:40
Bạn đang sử dụng phiên bản Python nào? Trước 2.2 bạn có thể sử dụng im_class, nhưng điều đó đã được thay đổi để hiển thị loại đối tượng tự ràng buộc. –
Điều cần biết. Nhưng tôi đang sử dụng 2.6. –