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
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():
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
isinstance(c, Cane) # True
isinstance(c, Animale) # True (anche la base)
isinstance(c, str) # Falseisinstance(x, BaseClass) juga mengenali semua subkelas: inilah yang terjadi
membuat pewarisan berguna untuk polimorfisme.
animali = [Cane("Fido", "X"), Animale("Pippo")]
for a in animali:
print(a.saluta()) # ogni oggetto risponde a suo modoMRO (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:
- terlihat pertama kali dalam contoh,
- lalu di kelasnya,
- kemudian di kelas dasar dalam urutan deklarasi.
Cane.__mro__
# (<class 'Cane'>, <class 'Animale'>, <class 'object'>)object adalah root dari setiap kelas di Python 3.
Giliranmu
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)`.
Tunjukkan petunjuk
super().__init__(merek) lalu self.model = model.
Solusi tersedia setelah 3 upaya
Tinjau latihan
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))`.
Tunjukkan petunjuk
sisi diri * sisi diri.
Solusi tersedia setelah 3 upaya
Tantangan tambahan
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()`.
Tunjukkan petunjuk
Declare class Square(Rectangle): and call super().__init__(side, side) in the constructor.
Solusi tersedia setelah 3 upaya