Trong Python, super()
là một hàm được sử dụng để gọi một phương thức ở class cha từ class con đang được kế thừa. Điều này giúp chúng ta tránh việc viết lại cùng một phương thức trong cả hai lớp, giảm sự trùng lặp code và dễ dàng bảo trì.
Cú pháp khai báo của super()
như sau:
class SubClass(BaseClass):
def some_method(self, arg):
super().some_method(arg)
Trong đó SubClass
kế thừa BaseClass
và gọi phương thức some_method()
của BaseClass
thông qua super()
.
Dưới đây là ba ví dụ minh họa sử dụng super()
:
Ví dụ 1: Kế thừa từ lớp cha và gọi phương thức của lớp cha
class Animal:
def __init__(self, name, age):
self.name = name
self.age = age
def make_sound(self):
print("Animal sound")
class Dog(Animal):
def __init__(self, name, age, breed):
super().__init__(name, age)
self.breed = breed
def make_sound(self):
super().make_sound()
print("Woof!")
Trong ví dụ này, Dog
kế thừa từ Animal
. Trong phương thức __init__()
của Dog
, super()
được sử dụng để gọi phương thức __init__()
của Animal
. Trong phương thức make_sound()
của Dog
, super()
được sử dụng để gọi phương thức make_sound()
của Animal
trước khi in ra chuỗi “Woof!”.
Ví dụ 2: Sử dụng super() trong nhiều level kế thừa
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
class Employee(Person):
def __init__(self, name, age, salary):
super().__init__(name, age)
self.salary = salary
class Manager(Employee):
def __init__(self, name, age, salary, department):
super().__init__(name, age, salary)
self.department = department
Trong ví dụ này, Manager
kế thừa từ Employee
và Employee
kế thừa từ Person
. Trong phương thức __init__()
của Manager
, super()
được sử dụng để gọi phương thức __init__()
của Employee
, và Employee
tiếp tục sử dụng super()
để gọi phương thức __init__()
của Person
.
Ví dụ 3: Kế thừa từ nhiều class cùng một lúc
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
class Employee:
def __init__(self, salary, hire_date):
self.salary = salary
self.hire_date = hire_date
class Manager(Person, Employee):
def __init__(self, name, age, salary, hire_date, department):
Person.__init__(self, name, age)
Employee.__init__(self, salary, hire_date)
self.department = department
Trong ví dụ này, chúng ta có ba class: Person
, Employee
và Manager
. Person
và Employee
đều có những thuộc tính khác nhau, nhưng cả hai đều được kế thừa bởi class Manager
. Vì thế, Manager
có thể truy cập và sử dụng các thuộc tính của cả Person
và Employee
.
Lớp Manager
có một số thuộc tính riêng của nó như department
. Trong phương thức khởi tạo của Manager
, chúng ta gọi phương thức khởi tạo của cả Person
và Employee
bằng cách sử dụng super()
để tránh trùng lặp code.
Ví dụ trên minh họa cách kế thừa từ nhiều class và sử dụng super()
để gọi phương thức khởi tạo của các class cha.
Ví dụ 4: Một ví dụ ứng dụng trong hệ thống Linux.
import os
class LinuxFileManager:
def __init__(self, filepath):
self.filepath = filepath
def open(self):
print(f"Opening file at {self.filepath}")
os.system(f"xdg-open {self.filepath}")
def close(self):
print(f"Closing file at {self.filepath}")
class RootFileManager(LinuxFileManager):
def __init__(self, filepath):
super().__init__(filepath)
def open(self):
print(f"Opening file at {self.filepath} as root")
os.system(f"sudo xdg-open {self.filepath}")
filepath = "/home/user/document.txt"
file_manager = RootFileManager(filepath)
file_manager.open()
file_manager.close()
Trong ví dụ này, RootFileManager
là một lớp con của LinuxFileManager
. Nó ghi đè phương thức open()
để mở file dưới quyền root bằng cách sử dụng sudo
command. Tuy nhiên, phương thức close()
vẫn được sử dụng từ lớp cha. Khi open()
được gọi trên đối tượng RootFileManager
, super()
được sử dụng để gọi phương thức open()
của lớp cha, sau đó thực hiện các thao tác bổ sung để mở file với quyền root.