ฉันเริ่มทำสิ่งที่คล้ายกันโดยทั่วไปแล้วแนวคิดคือการตรวจสอบเมื่อใดก็ตามที่วิธีการในคลาสพื้นฐานถูกนำไปใช้หรือไม่ได้อยู่ในคลาสย่อย กลับกลายเป็นวิธีที่ฉันทำในตอนแรกฉันไม่สามารถตรวจจับได้เมื่อคลาสระดับกลางกำลังใช้วิธีนี้จริง
วิธีแก้ปัญหาของฉันมันค่อนข้างง่ายจริงๆ การตั้งค่าแอตทริบิวต์วิธีการและทดสอบการมีอยู่ในภายหลัง นี่คือความเรียบง่ายของสิ่งทั้งหมด:
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()
UPDATE: โทรmethod()
จากrun_method()
(นั่นไม่ใช่วิญญาณเหรอ) และส่งผ่านข้อโต้แย้งทั้งหมดที่ไม่มีการแก้ไขไปยังวิธีการ
PS: คำตอบนี้ไม่ได้ตอบคำถามโดยตรง IMHO มีสองเหตุผลหนึ่งที่ต้องการทราบว่าคลาสใดกำหนดวิธีการ อันดับแรกคือการชี้นิ้วไปที่คลาสในรหัสการดีบัก (เช่นในการจัดการข้อยกเว้น) และประการที่สองคือการตรวจสอบว่ามีการนำวิธีการนี้มาใช้ใหม่หรือไม่ (โดยที่วิธีการคือต้นขั้วหมายถึงการดำเนินการโดยโปรแกรมเมอร์) คำตอบนี้แก้กรณีที่สองด้วยวิธีอื่น