Ana içeriğe geç
Modül 7 · Ders 2 ders 4Kurstaki 26/36~12 min
Modül dersleri (2/4)

Miras

Kalıtım, yeni bir sınıf (alt sınıf) oluşturmanıza olanak tanır. mevcut bir sınıftan (temel sınıf) nitelikleri ve yöntemleri devralır, ve bunları genişletebilir veya geçersiz kılabilir.

Temel sözdizimi

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__ öğesini yeniden yazmadan Animale öğesinden devralır.

super(): temel yöntemin çağrılması

Bir temel yöntemi genişletmek istediğinizde (tamamen değiştirmek değil), şunu kullanın: super():

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: tür kontrolü

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

isinstance(x, BaseClass) aynı zamanda tüm alt sınıfları da tanır: işte bu kalıtımı polimorfizm için yararlı kılar.

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

MRO (Yöntem Çözüm Sırası) — genel bakış

Çoklu mirasınız olduğunda Python hangi sıraya bakılacağına karar verir C3 algoritmasıyla hesaplanan MRO'yu takip ederek bir yöntem için. için Vakaların %95'inde şunu bilmek yeterlidir:

  1. örnekte ilk önce o görünür,
  2. daha sonra kendi sınıfında,
  3. Daha sonra temel sınıflarda bildirim sırasına göre.
Python
Cane.__mro__
# (<class 'Cane'>, <class 'Animale'>, <class 'object'>)

object Python 3'teki her sınıfın köküdür.

Sıra sende

Egzersiz#python.m7.l2.e1
Denemeler: 0Yükleniyor…

Verilen 'Araç sınıfı: def __init__(self, brand): self.brand = brand', 'Car(Vehicle)'ı super().__init__ çağıran ve self.model'i saklayan __init__(self, brand, model) ile tanımlayın. `a = Car('Fiat', '500')` oluşturun ve `(a.brand, a.model)`'i değerlendirin.

Düzenleyici yükleniyor…
İpucu göster

super().__init__(brand) sonra self.model = model.

3 denemeden sonra çözüm mevcut

Alıştırmayı gözden geçirin

Egzersiz#python.m7.l2.e2
Denemeler: 0Yükleniyor…

'class Shape: def field(self): return 0' ve 'class Square(Shape)'i __init__(self, side) ve side * side döndüren field() ile tanımlayın. `q = Square(5)` oluşturun ve `(q.area(), isinstance(q, Shape))` tuple'ını değerlendirin.

Düzenleyici yükleniyor…
İpucu göster

öz.taraf * öz.taraf.

3 denemeden sonra çözüm mevcut

Ek zorluk

Egzersiz#python.m7.l2.e3
Denemeler: 0Yükleniyor…

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()`.

Düzenleyici yükleniyor…
İpucu göster

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

3 denemeden sonra çözüm mevcut