الانتقال إلى المحتوى الرئيسي
الوحدة 7 · الدرس 2 من 426/36 في الدورة~12 min
دروس الوحدة (2/4)

الميراث

الوراثة تتيح لك إنشاء فئة جديدة (الفئة الفرعية) والتي يرث السمات والأساليب من فئة موجودة (الفئة الأساسية)، ويمكن تمديدها أو تجاوزها.

بناء الجملة الأساسي

Python
class Animale:
    def __init__(self, nome):
        self.nome = nome

    def saluta(self):
        return f"{self.nome} fa un verso"

class Cane(Animale):       # Cane EREDITA da Animale
    def saluta(self):       # OVERRIDE del metodo
        return f"{self.nome} dice WOOF!"

a = Animale("X")
c = Cane("Fido")
a.saluta()      # 'X fa un verso'
c.saluta()      # 'Fido dice WOOF!'

Cane يرث __init__ من Animale دون إعادة كتابته.

super(): استدعاء الطريقة الأساسية

عندما تريد توسيع طريقة أساسية (وليس استبدالها بالكامل)، استخدم محمي_INLINE_5:

Python
class Animale:
    def __init__(self, nome):
        self.nome = nome

class Cane(Animale):
    def __init__(self, nome, razza):
        super().__init__(nome)    # delega alla base
        self.razza = razza

c = Cane("Fido", "Labrador")
c.nome        # 'Fido'
c.razza       # 'Labrador'

isinstance: تأكد من الكتابة

Python
isinstance(c, Cane)        # True
isinstance(c, Animale)     # True (anche la base)
isinstance(c, str)         # False

isinstance(x, BaseClass) يتعرف أيضًا على جميع الفئات الفرعية: هذا هو ما يجعل الميراث مفيدًا في تعدد الأشكال.

Python
animali = [Cane("Fido", "X"), Animale("Pippo")]
for a in animali:
    print(a.saluta())        # ogni oggetto risponde a suo modo

MRO (ترتيب تحليل الطريقة) - نظرة عامة

عندما يكون لديك وراثة متعددة، تقرر بايثون الترتيب الذي ستبحث به للحصول على طريقة باتباع MRO، المحسوب باستخدام خوارزمية C3. ل في 95% من الحالات يكفي معرفة:

  1. يبدو أولاً في المثال،
  2. ثم في فئتها،
  3. ثم في الفئات الأساسية بترتيب الإعلان.
Python
Cane.__mro__
# (<class 'Cane'>, <class 'Animale'>, <class 'object'>)

object هو جذر كل فئة في Python 3.

دورك

تمرين#python.m7.l2.e1
المحاولات: 0جارٍ التحميل…

بالنظر إلى `صنف المركبة: def __init__(self, Brand): self.brand =brand`، حدد `Car(Vehicle)` باستخدام __init__(self, Brand, model) الذي يستدعي super().__init__ ويخزن self.model. أنشئ `a = Car('Fiat', '500')` وقم بتقييم `(a.brand, a.model)`.

جارٍ تحميل المحرر…
إظهار التلميح

super().__init__(brand) ثم self.model = model.

الحل متاح بعد 3 من المحاولات

تمرين المراجعة

تمرين#python.m7.l2.e2
المحاولات: 0جارٍ التحميل…

حدد شكل الفئة: def Area(self): قم بإرجاع 0 و`class Square(Shape)` مع __init__(self, Side) وarea() التي تُرجع الجانب * الجانب. أنشئ `q = Square(5)` وقم بتقييم الصف `(q.area(), isinstance(q, Shape))`.

جارٍ تحميل المحرر…
إظهار التلميح

الجانب الذاتي * الجانب الذاتي.

الحل متاح بعد 3 من المحاولات

التحدي الإضافي

تمرين#python.m7.l2.e3
المحاولات: 0جارٍ التحميل…

Create a class `Square` that inherits from the `Rectangle` class (defined below). The constructor of `Square` must take a single parameter `side` and pass it to `super().__init__(side, side)`. Instantiate a square with side `6` in `sq` and evaluate `sq.area()`.

جارٍ تحميل المحرر…
إظهار التلميح

Declare class Square(Rectangle): and call super().__init__(side, side) in the constructor.

الحل متاح بعد 3 من المحاولات