تعریف دوبارهٔ یک متد والد در فرزند با همان نام و امضا، برای رفتارِ خاصتر.
class Animal:
def __init__(self, name):
self.name = name
def speak(self):
raise NotImplementedError
class Dog(Animal):
def speak(self): # بازنویسی
return "واق واق"
d = Dog("رکس")
print(isinstance(d, Animal)) # True — فرزند «همان» والد هم هست
print(d.speak()) # واق واق — نسخهٔ فرزند اجرا شد
وقتی متد را بازنویسی میکنی سه انتخاب داری: جایگزینی کامل، توسعه با super()، یا (بهندرت) فراخوانی مشروط والد. قانون: امضای متد فرزند باید با والد سازگار بماند تا کدی که با والد کار میکرد نشکند (اصل جانشینی لیسکوف).
اشتباه رایج
هر رفتار مشترکی را باید با وراثت مدل کرد.
تصحیح
وراثت فقط برای رابطهٔ «هست» است. رفتارِ مشترکِ چیزهای نامرتبط را با تابع مشترک یا ترکیب مدل کن، نه با والدِ مصنوعی.