رفتن به محتوای اصلی
برنامه‌سازی پیشرفته با پایتون درس‌نامهٔ آزاد
مفهوم متوسط ۸ دقیقه

وراثت و بازنویسی

وراثت تکی، بازنویسی متد، super و همکاری سازنده‌ها با مثال حیوانات.

تعریف بازنویسی

تعریف دوبارهٔ یک متد والد در فرزند با همان نام و امضا، برای رفتارِ خاص‌تر.

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()، یا (به‌ندرت) فراخوانی مشروط والد. قانون: امضای متد فرزند باید با والد سازگار بماند تا کدی که با والد کار می‌کرد نشکند (اصل جانشینی لیسکوف).

برداشت نادرست رایج

اشتباه رایج

هر رفتار مشترکی را باید با وراثت مدل کرد.

تصحیح

وراثت فقط برای رابطهٔ «هست» است. رفتارِ مشترکِ چیزهای نامرتبط را با تابع مشترک یا ترکیب مدل کن، نه با والدِ مصنوعی.

مطالب مرتبط

از همین بخش و با برچسب‌های مشترک

این مطلب را خواندید؟ آن را علامت بزنید تا پیشرفت شما روی همین دستگاه ذخیره شود.

وضعیت پیشرفت برای وراثت و بازنویسی