29. Inheritance mendalam — Solusi pekerjaan rumah
File solusi .py:
exercises/29/homework/solutions/.
Soal 1 — Vehicle dan Car
Soal. Car yang mewarisi
describe dari Vehicle.
Solusi.
class Vehicle:
def __init__(self, name):
self.name = name
def describe(self):
print(f"{self.name} is a vehicle.")
class Car(Vehicle):
def __init__(self, name):
super().__init__(name)
Car("Beetle").describe() # Beetle is a vehicle. (inherited)Soal 2 — Override
Soal. Car.describe() mengatakan "car"
alih-alih "vehicle".
Solusi. Tambahkan ke class di atas:
class Car(Vehicle):
def __init__(self, name):
super().__init__(name)
def describe(self):
print(f"{self.name} is a car.")
Vehicle("Cart").describe() # Cart is a vehicle.
Car("Beetle").describe() # Beetle is a car.Instance Vehicle menemukan versi aslinya; instance
Car menemukan versinya sendiri terlebih dahulu.
Soal 3 — Memperluas parent
Soal. Car.describe() menjalankan versi
parent, lalu menambahkan sebuah baris.
Solusi.
class Car(Vehicle):
def __init__(self, name):
super().__init__(name)
def describe(self):
super().describe()
print(" It has four wheels.")
Car("Beetle").describe()
# Beetle is a vehicle.
# It has four wheels.Kesalahan umum.
- Memanggil
self.describe()di dalamdescribememanggil method yang sama ini lagi dan menyebabkan rekursi tanpa henti. Gunakansuper().describe()untuk memanggil versi parent.
Tantangan — Dua anak
Soal. Bird dan Fish
keduanya mewarisi Animal dan meng-override
move.
Solusi.
class Animal:
def __init__(self, name):
self.name = name
def move(self):
print(f"{self.name} moves.")
class Bird(Animal):
def __init__(self, name):
super().__init__(name)
def move(self):
print(f"{self.name} flies.")
class Fish(Animal):
def __init__(self, name):
super().__init__(name)
def move(self):
print(f"{self.name} swims.")
creatures = [Bird("Robin"), Fish("Nemo")]
for c in creatures:
c.move()
# Robin flies.
# Nemo swims.Kedua anak mendefinisikan move dengan caranya
masing-masing. Karena move dipanggil melalui variable loop
c, Python menggunakan versi yang tepat berdasarkan tipe
aktual setiap object.
Selesai?
Kamu bisa berbagi perilaku dengan class dasar dan mengkhususkannya di anak — mewarisi, meng-override, dan memperluas. Bab terakhir Bagian 6 — Merancang class kecil — membahas cara membuat class yang nyaman digunakan.