CodeGym /Các khóa học /Python SELF VI /Khởi tạo kế thừa

Khởi tạo kế thừa

Python SELF VI
Mức độ , Bài học
Có sẵn

7.1 Phương thức super()

Đã nói đến thừa kế, thì sẽ có ích khi bàn về những chi tiết nhỏ trong việc xử lý các fields và methods của lớp cơ sở. Python có phương thức super() đặc biệt cho việc này. Phương thức này được dùng để gọi các phương thức của lớp cơ sở bên trong lớp con.

Nó có ba ứng dụng chính:

Gọi các phương thức của lớp cha:

Phương thức super() cho phép gọi phương thức của lớp cha từ lớp con mà không cần chỉ rõ tên của lớp cha. Điều này đặc biệt hữu ích khi làm việc với đa thừa kế và giúp tránh lỗi khi thay đổi cây tổ chức của lớp.

Khởi tạo lớp cơ sở:

super() thường được dùng trong constructor của lớp con để gọi constructor của lớp cơ sở, cho phép khởi tạo các thuộc tính của lớp cơ sở trong lớp con.

Hỗ trợ đa thừa kế:

Trong trường hợp đa thừa kế, super() giải quyết đúng thứ tự gọi các phương thức (MRO, Method Resolution Order), khiến nó được ưu tiên sử dụng thay vì gọi trực tiếp các phương thức của lớp cha. Chúng ta sẽ nói thêm về điều này sau.

7.2 Constructor của lớp cơ sở

Constructor của lớp cơ sở phải được gọi tường minh. Có vẻ như điều này xảy ra tự động, nhưng thực tế không phải vậy. Constructor của lớp cơ sở luôn cần được gọi tường minh, vì rất thường xuyên cần truyền các tham số đặc biệt vào đó.

Ví dụ:


class Animal:
    def __init__(self, type, name):
        self.type = type
        self.name = name
         
        
class Dog(Animal):
    def __init__(self, name):
        super().__init__("Chó", name)  # Gọi constructor của lớp cơ sở
        
class Cat(Animal):
    def __init__(self, name):
        super().__init__("Mèo", name)  # Gọi constructor của lớp cơ sở
        
        
# Tạo đối tượng Dog
dog = Dog("Buddy")
print(dog) 

Trong ví dụ này, constructor của lớp cơ sở (Animal) có hai tham số: loại động vật và tên của nó. Còn các lớp kế thừa chỉ có một — chỉ tên.

Chính trong constructor của các lớp DogCat mới quyết định điều gì sẽ được truyền vào constructor của lớp cơ sở — tên loại động vật như là "Chó" và "Mèo".

Vậy nên:

  • Constructor của lớp cơ sở chắc chắn phải được gọi trong constructor của lớp kế thừa.
  • Để làm điều này, hãy sử dụng phương thức super().
  • Không cần truyền tham số self riêng biệt — Python sẽ tự động điền tham số này khi gọi phương thức.

7.3 Sử dụng phương thức super()

Phương thức super() trong Python không chỉ được sử dụng trong constructors mà còn trong các phương thức khác của lớp để gọi các phương thức của lớp cha. Điều này rất hữu ích khi cần mở rộng hoặc thay đổi hành vi của một phương thức được định nghĩa trong lớp cha.

Hãy cùng xem qua một vài ví dụ:

Gọi phương thức của lớp cha trong phương thức của lớp con

Trong ví dụ này, phương thức speak() trong lớp Dog trước tiên gọi phương thức speak() từ lớp Animal bằng cách sử dụng super(), sau đó thêm vào hành vi riêng của nó.


class Animal:
    def speak(self):
        return "Một số âm thanh động vật chung"
        

class Dog(Animal):
    def speak(self):
        parent_speech = super().speak()  # Gọi phương thức của lớp cha
        return f"{parent_speech} Và chó sủa!"
        
dog = Dog()
print(dog.speak())  # Sẽ in ra: Một số âm thanh động vật chung Và chó sủa!

Gọi phương thức của lớp cha để kiểm tra trạng thái

Trong ví dụ này, phương thức check_health() trong lớp Dog gọi phương thức check_health() từ lớp Animal để thêm vào các kiểm tra bổ sung.


class Animal:
    def check_health(self):
        return "Động vật khỏe mạnh"
        

class Dog(Animal):
    def check_health(self):
        parent_check = super().check_health()  # Gọi phương thức của lớp cha
        return f"{parent_check}. Chó cần đi dạo!"
        
dog = Dog()
print(dog.check_health())  # Sẽ in ra: Động vật khỏe mạnh. Chó cần đi dạo!

Gọi phương thức của lớp cha trong phương thức thay đổi trạng thái

Trong ví dụ này, phương thức withdraw() trong lớp SavingsAccount trước tiên kiểm tra xem có vượt quá hạn mức rút tiền hay không, và nếu không, gọi phương thức withdraw() từ lớp BankAccount để thực hiện giao dịch.


class BankAccount:
    def __init__(self, balance):
        self.balance = balance
        

    def withdraw(self, amount):
        if self.balance >= amount:
            self.balance -= amount
            return f"Đã rút {amount}. Số dư mới: {self.balance}"
        return "Không đủ số dư"
        

class SavingsAccount(BankAccount):
    def withdraw(self, amount):
        if amount > 1000:
            return "Vượt quá hạn mức rút tiền"
        return super().withdraw(amount)  # Gọi phương thức của lớp cha
        

savings = SavingsAccount(1500)
print(savings.withdraw(500))  # Sẽ in ra: Đã rút 500. Số dư mới: 1000
print(savings.withdraw(1500))  # Sẽ in ra: Vượt quá hạn mức rút tiền
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION