Sunday, January 19, 2025

[Python] Lesson 44 – Super function

-

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ừ EmployeeEmployee 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, EmployeeManager. PersonEmployee đề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ả PersonEmployee.

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ả PersonEmployee 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.

LEAVE A REPLY

Please enter your comment!
Please enter your name here

4,956FansLike
256FollowersFollow
223SubscribersSubscribe
spot_img

Related Stories