Tài liệu

Hàm super() trong Python: Giải thích và ứng dụng

Huy Erick

Hàm super() trong Python trả về một đối tượng proxy (đối tượng tạm thời của một siêu class) cho phép chúng ta truy cập các method của class cơ sở. Trong Python, chúng ta sử...

Hàm super() trong Python trả về một đối tượng proxy (đối tượng tạm thời của một siêu class) cho phép chúng ta truy cập các method của class cơ sở.

Trong Python, chúng ta sử dụng hàm super() trong hai trường hợp chính: để tránh việc sử dụng tên class cơ sở một cách rõ ràng và để xử lý Đa kế thừa.

Hàm super() trong Kế thừa đơn

Trong trường hợp kế thừa đơn, hàm super() giúp chúng ta tham chiếu tới class cơ sở một cách dễ dàng. Ví dụ sau sẽ giúp bạn hiểu rõ hơn:

class Mammal(object):
    def __init__(self, mammalName):
        print(mammalName, 'là động vật máu nóng.')

class Voi(Mammal):
    def __init__(self):
        print('Voi có 4 chân.')
        super().__init__('Voi')

d1 = Voi()

Kết quả khi chạy chương trình sẽ là:

Voi có 4 chân.
Voi là động vật máu nóng.

Ở đây, chúng ta gọi method __init__() của lớp Mammal (từ class Voi) bằng cách sử dụng super().__init__('Voi') thay vì Mammal.__init__(self, 'Voi'). Điều này giúp chúng ta có thể dễ dàng đổi tên class cơ sở nếu cần thiết.

Hàm super() trong Đa kế thừa

Hãy xem ví dụ sau để hiểu cách sử dụng hàm super() trong Đa kế thừa:

class Animal:
    def __init__(self, Animal):
        print(Animal, 'là một loài động vật.')

class Mammal(Animal):
    def __init__(self, mammalName):
        print(mammalName, 'là động vật máu nóng.')
        super().__init__(mammalName)

class NonWingedMammal(Mammal):
    def __init__(self, NonWingedMammal):
        print(NonWingedMammal, "không thể bay.")
        super().__init__(NonWingedMammal)

class NonMarineMammal(Mammal):
    def __init__(self, NonMarineMammal):
        print(NonMarineMammal, "không thể bơi.")
        super().__init__(NonMarineMammal)

class Voi(NonMarineMammal, NonWingedMammal):
    def __init__(self):
        print('Voi có 4 chân.')
        super().__init__('Voi')

d = Voi()

Kết quả khi chạy chương trình sẽ là:

Voi có 4 chân.
Voi không thể bơi.
Voi không thể bay.
Voi là động vật máu nóng.
Voi là một loài động vật.

Trong trường hợp Đa kế thừa, hàm super() giúp chúng ta sắp xếp thứ tự kế thừa các method một cách chính xác. Nếu có nhiều class cha mẹ như Voi(NonMarineMammal, NonWingedMammal), các method của NonMarineMammal sẽ được gọi trước NonWingedMammal.

Phương pháp giải quyết thứ tự (Method Resolution Order - MRO)

MRO là thứ tự các method được kế thừa khi có Đa kế thừa. Bạn có thể kiểm tra MRO bằng cách sử dụng thuộc tính __mro__. Ví dụ:

>>> Voi.__mro__
(, , , , , )

Điều này giúp bạn hiểu cách hoạt động của MRO. Một method trong các lớp dẫn xuất luôn được gọi trước method của class cơ sở. Trong ví dụ của chúng ta, class Voi được gọi trước NonMarineMammal hoặc NonWingedMammal, hai class này lại được gọi trước Mammal, và Mammal lại được gọi trước Animal, cuối cùng mới đến object.

Để tìm hiểu thêm về các hàm trong Python, hãy truy cập trang web "Các hàm Python tích hợp sẵn".

1