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 dalam describe memanggil method yang sama ini lagi dan menyebabkan rekursi tanpa henti. Gunakan super().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.