Python: Ghi đè phương thức (Override)
Giải phóng thời gian, khai phóng năng lực
Python cho phép lớp con có quyền tạo một phương thức giống hệt với phương thức của lớp cha. Điều này gọi là ghi đè phương thức (Override). Việc ghi đè này cho phép một lớp thừa kế hành vi từ một lớp khác nhưng có thể thay đổi hành vi đó khi cần.
Quy tắc cần nhớ khi ghi đè:
- Phương thức ghi đè phải cùng tên và số lượng tham số với phương thức của lớp cha.
Ví dụ ta có lớp Animal như sau:
#tạo lớp Animal: class Animal: #hàm tạo 3 tham số def __init__(self, ID, name, gender, age): self.ID = ID self.name = name self.gender = gender self.age = age #phương thức nhập liệu def inputInfo(self): self.ID = input("Input ID: ") self.name = input("Input name: ") self.gender = input("Input gender: ") self.age = input("Input age: ") #phương thức hiển thị thông tin đối tượng def showInfo(self): print(f"ID: {self.ID}") print(f"Name: {self.name}") print(f"Gender: {self.gender}") print(f"Age: {self.age}")
Trong lớp Animal có hai phương thức là inputInfo() dùng để nhập liệu cho các thuộc tính id, name và age, còn phương thức showInfo() dùng để nhập liệu cho các thuộc tính id, name và age.
Và bây giờ ta có lớp Cat thừa kế lớp Animal ở trên như sau:
class Cat(Animal): def __init__(self, ID, name, gender, age, color): super().__init__(ID, name, gender, age) self.color = color
Thì đương nhiên lớp Cat sẽ được thừa hưởng các phương thức inputInfo() và showInfo() của lớp Animal.
Tuy nhiên, phương thức inputInfo() của lớp cha Animal lại không thể nhập liệu cho thuộc tính color của lớp con Cat, và phương thức showInfo() của lớp cha Animal lại không thể hiển thị cho thuộc tính color của lớp con Cat.
Để khắc phục thì ta tiến hành ghi đè hai phương thức này như sau:
class Cat(Animal): def __init__(self, ID, name, gender, age, color): super().__init__(ID, name, gender, age) self.color = color #ghi đè phương thức inputInfo() của lớp cha def inputInfo(self): super().inputInfo() self.color = input("Input color: ") #ghi đè phương thức showInfo() của lớp cha def showInfo(self): super().showInfo() print(f"Color: {self.color}")
Ở đoạn code trên có sử dụng đến super() để gọi được các phương thức inputInfo() và showInfo() của lớp cha.
Còn dưới đây là đoạn code hoàn chỉnh, bạn có thể copy và chạy thử:
#tạo lớp Animal: class Animal: #hàm tạo 4 tham số def __init__(self, ID, name, gender, age): self.ID = ID self.name = name self.gender = gender self.age = age #phương thức nhập liệu def inputInfo(self): self.ID = input("Input ID: ") self.name = input("Input name: ") self.gender = input("Input gender: ") self.age = input("Input age: ") #phương thức hiển thị thông tin đối tượng def showInfo(self): print(f"ID: {self.ID}") print(f"Name: {self.name}") print(f"Gender: {self.gender}") print(f"Age: {self.age}") class Cat(Animal): def __init__(self, ID, name, gender, age, color): super().__init__(ID, name, gender, age) self.color = color #ghi đè phương thức inputInfo() của lớp cha def inputInfo(self): super().inputInfo() self.color = input("Input color: ") #ghi đè phương thức showInfo() của lớp cha def showInfo(self): super().showInfo() print(f"Color: {self.color}") cat = Cat("", "", "", "", "") cat.inputInfo() cat.showInfo()
Kết quả:
Input ID: 5678 Input name: Moon Input gender: Male Input age: 1.5 Input color: Black ID: 5678 Name: Moon Gender: Male Age: 1.5 Color: Black
Lưu ý: Các chú thích sẽ cung cấp thêm thông tin về chương trình. Các chú thích không ảnh hưởng đến chức năng của đoạn mã mà chúng chú thích.
Lưu ý rằng phương thức showInfo() bây giờ sẽ in ra thông tin cụ thể trong lớp con. Điều này có nghĩa rằng một lời gọi tới phương thức showInfo() sử dụng đối tượng lớp con là cat.showInfo() trước tiên sẽ tìm kiếm phương thức trong lớp con. Sau đó phương thức showInfo() được ghi đè trong lớp con, nó gọi phương thức showInfo() của lớp con mà không phải phương thức showInfo() của lớp cha. Phương thức inputInfo() cũng tương tự như vậy.
Giải phóng thời gian, khai phóng năng lực