Tôi bắt đầu làm điều gì đó tương tự, về cơ bản, ý tưởng đang kiểm tra bất cứ khi nào một phương thức trong lớp cơ sở được triển khai hay không trong lớp con. Hóa ra theo cách tôi đã làm ban đầu, tôi không thể phát hiện ra khi nào một lớp trung gian đang thực sự triển khai phương thức này.
Cách giải quyết của tôi cho nó thực sự khá đơn giản; thiết lập một thuộc tính phương thức và kiểm tra sự hiện diện của nó sau đó. Đây là đơn giản hóa toàn bộ:
class A():
def method(self):
pass
method._orig = None
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()
C().run_method()
D().run_method()
CẬP NHẬT: Thực tế cuộc gọi method()
từrun_method()
(đó không phải là linh hồn sao?) Và nó truyền tất cả các đối số chưa được sửa đổi vào phương thức.
Tái bút: Câu trả lời này không trực tiếp trả lời câu hỏi. IMHO có hai lý do mà 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ỏ ngón tay vào một lớp trong mã gỡ lỗi (chẳng hạn như trong xử lý ngoại lệ), và thứ hai là xác định xem phương thức đã được triển khai lại hay chưa (trong đó phương thức là một sơ khai được lập trình viên thực hiệ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.