Lompati ke konten utama
Modul 7 · Pelajaran 2 dari 426/36 dalam kursus~12 min
Pelajaran modul (2/4)

Warisan

Warisan memungkinkan Anda membuat kelas baru (subkelas) itu mewarisi atribut dan metode dari kelas yang sudah ada (kelas dasar), dan dapat memperluas atau menimpanya.

Sintaks dasar

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 mewarisi __init__ dari Animale tanpa menulis ulang.

super(): memanggil metode dasar

Bila Anda ingin memperluas metode dasar (tidak sepenuhnya menggantinya), gunakan 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: centang tipe

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

isinstance(x, BaseClass) juga mengenali semua subkelas: inilah yang terjadi membuat pewarisan berguna untuk polimorfisme.

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

MRO (Urutan Resolusi Metode) — ikhtisar

Ketika Anda memiliki banyak warisan, Python memutuskan urutan mana yang akan dicari untuk metode dengan mengikuti MRO, dihitung dengan algoritma C3. Untuk 95% kasus cukup mengetahui:

  1. terlihat pertama kali dalam contoh,
  2. lalu di kelasnya,
  3. kemudian di kelas dasar dalam urutan deklarasi.
Python
Cane.__mro__
# (<class 'Cane'>, <class 'Animale'>, <class 'object'>)

object adalah root dari setiap kelas di Python 3.

Giliranmu

Latihan#python.m7.l2.e1
Upaya: 0Memuat…

Diberikan `kelas Kendaraan: def __init__(self, brand): self.brand = brand`, tentukan `Car(Vehicle)` dengan __init__(self, brand, model) yang memanggil super().__init__ dan menyimpan self.model. Buat `a = Car('Fiat', '500')` dan evaluasi `(a.brand, a.model)`.

Memuat editor…
Tunjukkan petunjuk

super().__init__(merek) lalu self.model = model.

Solusi tersedia setelah 3 upaya

Tinjau latihan

Latihan#python.m7.l2.e2
Upaya: 0Memuat…

Tentukan `kelas Bentuk: def area(diri): kembalikan 0` dan `kelas Kotak(Bentuk)` dengan __init__(diri, sisi) dan area() yang mengembalikan sisi * sisi. Buat `q = Square(5)` dan evaluasi tupel `(q.area(), isinstance(q, Shape))`.

Memuat editor…
Tunjukkan petunjuk

sisi diri * sisi diri.

Solusi tersedia setelah 3 upaya

Tantangan tambahan

Latihan#python.m7.l2.e3
Upaya: 0Memuat…

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

Memuat editor…
Tunjukkan petunjuk

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

Solusi tersedia setelah 3 upaya