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.