Thông báo: Download 4 khóa học Python từ cơ bản đến nâng cao tại đây.
Sử dụng super() trong Python
Trong bài viết này, bạn sẽ học cách sử dụng hàm super() trong Python để ủy quyền gọi các phương thức từ lớp cha khi ghi đè (override) các phương thức trong lớp con. Việc sử dụng super() không chỉ giúp tái sử dụng mã nguồn mà còn đảm bảo tính kế thừa và mở rộng dễ dàng giữa các lớp, giúp mã nguồn trở nên gọn gàng và dễ bảo trì hơn.

Giới thiệu về super() trong Python
Đầu tiên, hãy định nghĩa lớp Employee:
class Employee:
def __init__(self, name, base_pay, bonus):
self.name = name
self.base_pay = base_pay
self.bonus = bonus
def get_pay(self):
return self.base_pay + self.bonus
Lớp Employee có ba biến thuộc tính là name, base_pay, và bonus. Nó cũng có phương thức get_pay() để tính tổng lương cơ bản và tiền thưởng.
Tiếp theo, định nghĩa lớp SalesEmployee kế thừa từ lớp Employee:
Bài viết này được đăng tại [free tuts .net]
class SalesEmployee(Employee):
def __init__(self, name, base_pay, bonus, sales_incentive):
self.name = name
self.base_pay = base_pay
self.bonus = bonus
self.sales_incentive = sales_incentive
def get_pay(self):
return self.base_pay + self.bonus + self.sales_incentive
Lớp SalesEmployee có bốn biến thuộc tính: name, base_pay, bonus, và sales_incentive. Nó cũng có phương thức get_pay() ghi đè (override) phương thức get_pay() của lớp Employee.
super().__init__() trong Python
Phương thức __init__() của lớp SalesEmployee có một số phần giống với phương thức __init__() của lớp Employee. Để tránh lặp lại mã, bạn có thể gọi phương thức __init__() của lớp Employee từ trong phương thức __init__() của lớp SalesEmployee.
Để tham chiếu tới lớp Employee trong lớp SalesEmployee, bạn sử dụng super(). Hàm super() trả về một tham chiếu đến lớp cha từ lớp con.
Dưới đây là cách định nghĩa lại lớp SalesEmployee bằng cách sử dụng super() để gọi phương thức __init__() của lớp Employee:
class SalesEmployee(Employee):
def __init__(self, name, base_pay, bonus, sales_incentive):
super().__init__(name, base_pay, bonus)
self.sales_incentive = sales_incentive
def get_pay(self):
return self.base_pay + self.bonus + self.sales_incentive
Khi bạn tạo một đối tượng từ lớp SalesEmployee, Python sẽ thực thi phương thức __init__() của lớp SalesEmployee. Trong đó, phương thức này gọi phương thức __init__() của lớp Employee để khởi tạo các thuộc tính name, base_pay, và bonus.
Ủy quyền gọi các phương thức từ lớp cha
Phương thức get_pay() của lớp SalesEmployee có một số logic đã được định nghĩa trong phương thức get_pay() của lớp Employee. Do đó, bạn có thể tái sử dụng logic này trong phương thức get_pay() của lớp SalesEmployee.
Để làm điều đó, bạn có thể gọi phương thức get_pay() của lớp Employee trong phương thức get_pay() của lớp SalesEmployee như sau:
class SalesEmployee(Employee):
def __init__(self, name, base_pay, bonus, sales_incentive):
super().__init__(name, base_pay, bonus)
self.sales_incentive = sales_incentive
def get_pay(self):
return super().get_pay() + self.sales_incentive
Dòng mã super().get_pay() gọi phương thức get_pay() của lớp Employee từ trong phương thức get_pay() của lớp SalesEmployee. Khi bạn gọi phương thức get_pay() từ một đối tượng của lớp SalesEmployee, nó sẽ gọi phương thức get_pay() từ lớp cha (lớp Employee) và trả về tổng lương cơ bản, tiền thưởng, và tiền thưởng bán hàng.
Dưới đây là toàn bộ mã:
class Employee:
def __init__(self, name, base_pay, bonus):
self.name = name
self.base_pay = base_pay
self.bonus = bonus
def get_pay(self):
return self.base_pay + self.bonus
class SalesEmployee(Employee):
def __init__(self, name, base_pay, bonus, sales_incentive):
super().__init__(name, base_pay, bonus)
self.sales_incentive = sales_incentive
def get_pay(self):
return super().get_pay() + self.sales_incentive
if __name__ == '__main__':
sales_employee = SalesEmployee('John', 5000, 1000, 2000)
print(sales_employee.get_pay()) # 8000
Kết bài
Sử dụng super() để gọi các phương thức của lớp cha từ lớp con giúp bạn tối ưu hóa việc tái sử dụng mã và tránh lặp lại không cần thiết. Bằng cách này, bạn có thể mở rộng các lớp một cách linh hoạt, giữ cho mã nguồn dễ hiểu và dễ bảo trì, đồng thời vẫn tận dụng được logic sẵn có từ lớp cha.

Các kiểu dữ liệu trong C ( int - float - double - char ...)
Thuật toán tìm ước chung lớn nhất trong C/C++
Cấu trúc lệnh switch case trong C++ (có bài tập thực hành)
ComboBox - ListBox trong lập trình C# winforms
Random trong Python: Tạo số random ngẫu nhiên
Lệnh cin và cout trong C++
Cách khai báo biến trong PHP, các loại biến thường gặp
Download và cài đặt Vertrigo Server
Thẻ li trong HTML
Thẻ article trong HTML5
Cấu trúc HTML5: Cách tạo template HTML5 đầu tiên
Cách dùng thẻ img trong HTML và các thuộc tính của img
Thẻ a trong HTML và các thuộc tính của thẻ a thường dùng