فصل اول: کلاس‌ها و برنامه‌نویسی شیءگرای عمیق

وراثت، MRO و super()

وراثت چندگانه و ترتیب تفکیک متد

پایتون از وراثت چندگانه پشتیبانی می‌کند، یعنی یک کلاس می‌تواند از چند کلاس والد به‌طور همزمان ارث‌بری کند. این قابلیت قدرتمند است اما اگر بدون دقت استفاده شود، می‌تواند به ابهام در فراخوانی متدها منجر شود.

class Flyable:
    def move(self):
        return "در حال پرواز"

class Swimmable:
    def move(self):
        return "در حال شنا"

class Duck(Flyable, Swimmable):
    pass

d = Duck()
print(d.move())          # در حال پرواز
print(Duck.__mro__)      # ترتیب جست‌وجوی متد

پایتون برای تعیین این‌که کدام متد فراخوانی شود، از الگوریتمی به نام MRO (Method Resolution Order) استفاده می‌کند که بر پایه‌ی الگوریتم C3 است. می‌توانید این ترتیب را با ClassName.__mro__ یا ClassName.mro() مشاهده کنید.

تابع super() ابزاری است که به شما اجازه می‌دهد بدون ذکر مستقیم نام کلاس والد، متد آن را فراخوانی کنید. این کار به‌ویژه در وراثت چندگانه اهمیت زیادی دارد چون با تغییر ساختار وراثت، کد شما همچنان درست کار می‌کند:

class Animal:
    def __init__(self, name):
        self.name = name

class Dog(Animal):
    def __init__(self, name, breed):
        super().__init__(name)
        self.breed = breed

توصیه‌ی عملی در پروژه‌های واقعی این است که وراثت چندگانه را فقط زمانی به کار ببرید که واقعاً معنادار باشد، مثل الگوی «میکسین» (mixin) که در فریمورک‌هایی مانند جنگو نیز دیده می‌شود.

برای ذخیره‌ی پیشرفت و شرکت در آزمون، وارد شوید — رایگان است.