Python Inheritance – Kế thừa
Khi chúng ta muốn mở rộng một lớp (class) hiện có, chúng ta có thể sửa đổi lớp đó. Nhưng như thế có thể dẫn đến việc gây lỗi hoặc ảnh hưởng đến những đối tượng khác. Chúng ta cũng có thể tạo mới một class, copy những gì đang có và viết thêm mới những tính năng mà chúng ta mong muốn. Nhưng như thế thì code của chúng ta lại thừa và khó bảo trì.
Vậy giải pháp là kế thừa (Inheritance)
Nội dung của bài
Kế thừa (Inheritance) là gì?
Kế thừa là quá trình tạo một class mới từ một class cũ. Một lớp được tạo thông qua kế thừa sẽ thừa hưởng toàn bộ code của lớp cũ ( như các thuộc tính, các phương thức).
Khi một class kế thừa từ một class khác, class kế thừa được gọi là class con hay class dẫn xuất. Class được kế thừa gọi là class cha hoặc class cơ sở.
Định nghĩa một lớp cơ sở ( base class)
Một lớp không kế thừa từ một lớp nào khác gọi là lớp cơ sở.
class Animal:
def description(self):
print("I'm an Animal!")
Ví dụ trên chúng ta thử áp dụng tư thực tế, chúng ta xây dựng lớp động vật là lớp cơ sở cho các loại động vật: chó, mèo…
Định nghĩa một lớp con (subclassing)
class Animal:
def description(self):
print("I'm an Animal!")
class Dog(Animal):
pass
Tạo một lớp mới kế thừa từ lớp cơ sở gọi là lớp con. Trong lớp con chúng ta có thể thêm mới chức năng hoặc ghi đè chức năng hiện có.
Giờ chúng ta thử tạo ra đối tượng từ class Dog:
class Animal:
def description(self):
print("I'm an Animal!")
class Dog(Animal):
pass
an = Animal()
shiba = Dog()
an.description()
# prints I'm an Animal!
shiba.description()
# prints I'm an Animal!
Lớp Dog đang kế thừa hoàn toàn các chức năng của lớp Animal và chưa có thay đổi gì. Nên khi chúng ta gọi đến phương thức description() ở hai đối tượng shiba và an thì đều cho kết quả giống nhau.
Ghi đè nên chức năng hiện có – Override a Method
class Animal:
def description(self):
print("I'm an Animal!")
class Dog(Animal):
def description(self):
print("I'm a dog!")
an = Animal()
shiba = Dog()
an.description()
# prints I'm an Animal!
shiba.description()
# prints I'm a dog!
Trong lớp con chúng ta đã khai báo phương thức description() có cùng tên với phương thức của lớp cơ sở. Nên khi chúng ta thực hiện lời gọi shiba.description(), phương thức trong lớp con được thực thi.
Thêm một phương thức mới
Lớp con cũng có thể định nghĩa một phương thức mới chưa có trong lớp cơ sở.
class Animal:
def description(self):
print("I'm an Animal!")
class Dog(Animal):
def description(self):
print("I'm a dog!")
def bark(self, times):
print(f'{"woof! " * times}')
shiba = Dog()
shiba.bark(3)
# prints woof! woof! woof!
Phương thức bark() chỉ có trong lớp Dog mà không có trong lớp Animal.
Hàm super()
Đôi khi bạn ghi đè một phương thức của lớp cơ sở nhưng muốn sử dụng lại phương thức của lớp cơ sở và thêm vào một số tính năng mới. Bạn có thể sử dụng hàm super() để làm điều này.
# base class
class Animal():
def __init__(self, color):
self.color = color
def description(self):
print("I'm a", self.color, "Animal")
# subclass
class Dog(Animal):
def __init__(self, color, foots):
super().__init__(color) # invoke Animal’s __init__() method
self.foots = foots
def description(self):
print("I'm a", self.color, "dog and I have", self.foots, "foots!")
# create an object from each class
an = Animal('White')
shiba = Dog('Black', 4)
an.description()
# Prints I'm a White Animal
shiba.description()
# Prints I'm a Black dog, I have 4 foots
Kế thừa từ nhiều lớp cơ sở – Multiple Inheritance
Python cho phép một lớp có thể kế thừa từ nhiều lớp cở sở.
class Animal:
def description(self):
print("I'm an Animal!")
class FlyingAnimal:
def fly(self):
print("I can fly!")
class Bird(Animal, FlyingAnimal):
pass
bird = Bird()
bird.description()
# prints I'm an Animal!
bird.fly()
# prints I can fly!
Lớp con Bird kế toàn tất cả các phương thức của lớp Animal và FlyingAnimal.
Video demo
Tổng kết
Thừa kế là kiến thức rất quan trọng trong lập trình hướng đối tượng. Các bạn hãy thực hành thật tốt phần này nhé.