Python: Ghi đè phương thức (Override)

Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
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.

» Tiếp: super()
« Trước: Thừa kế (Inheritant)
Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực
Copied !!!