Python super ()

Nội trang super () trả về một đối tượng proxy (đối tượng tạm thời của lớp cha) cho phép chúng ta truy cập các phương thức của lớp cơ sở.

Trong Python, super()có hai trường hợp sử dụng chính:

  • Cho phép chúng tôi tránh sử dụng tên lớp cơ sở một cách rõ ràng
  • Làm việc với nhiều người thừa kế

Ví dụ 1: super () với đơn thừa kế

Trong trường hợp thừa kế đơn, nó cho phép chúng ta tham chiếu đến lớp cơ sở bằng super().

 class Mammal(object): def __init__(self, mammalName): print(mammalName, 'is a warm-blooded animal.') class Dog(Mammal): def __init__(self): print('Dog has four legs.') super().__init__('Dog') d1 = Dog()

Đầu ra

Con chó có bốn chân. Chó là loài động vật máu nóng.

Ở đây, chúng tôi đã gọi __init__()phương thức của lớp Mammal (từ lớp Dog) bằng cách sử dụng mã

 super () .__ init __ ('Con chó')

thay vì

 Động vật có vú .__ init __ (tự, 'Chó')

Vì chúng ta không cần chỉ định tên của lớp cơ sở khi chúng ta gọi các thành viên của nó, chúng ta có thể dễ dàng thay đổi tên lớp cơ sở (nếu cần).

 # changing base class to CanidaeFamily class Dog(CanidaeFamily): def __init__(self): print('Dog has four legs.') # no need to change this super().__init__('Dog')

Nội super()trang trả về một đối tượng proxy, một đối tượng thay thế có thể gọi các phương thức của lớp cơ sở thông qua ủy quyền. Điều này được gọi là hướng dẫn (khả năng tham chiếu đối tượng cơ sở với super())

Vì hướng dẫn được tính toán trong thời gian chạy, chúng ta có thể sử dụng các lớp cơ sở khác nhau tại các thời điểm khác nhau (nếu chúng ta cần).

Ví dụ 2: super () với nhiều thừa kế

 class Animal: def __init__(self, Animal): print(Animal, 'is an animal.'); class Mammal(Animal): def __init__(self, mammalName): print(mammalName, 'is a warm-blooded animal.') super().__init__(mammalName) class NonWingedMammal(Mammal): def __init__(self, NonWingedMammal): print(NonWingedMammal, "can't fly.") super().__init__(NonWingedMammal) class NonMarineMammal(Mammal): def __init__(self, NonMarineMammal): print(NonMarineMammal, "can't swim.") super().__init__(NonMarineMammal) class Dog(NonMarineMammal, NonWingedMammal): def __init__(self): print('Dog has 4 legs.'); super().__init__('Dog') d = Dog() print('') bat = NonMarineMammal('Bat')

Đầu ra

Con chó có 4 chân. Con chó không biết bơi. Con chó không thể bay. Chó là loài động vật máu nóng. Chó là một loài động vật. Bat không biết bơi. Dơi là loài động vật máu nóng. Con dơi là một con vật.

Thứ tự phân giải phương pháp (MRO)

Thứ tự phân giải phương thức (MRO) là thứ tự mà các phương thức sẽ được kế thừa khi có đa kế thừa. Bạn có thể xem MRO bằng cách sử dụng __mro__thuộc tính.

 >>> Con chó .__ mro__ (,,,,)

Đây là cách MRO hoạt động:

  • Một phương thức trong các lời gọi dẫn xuất luôn được gọi trước phương thức của lớp cơ sở.
    Trong ví dụ của chúng tôi, lớp Dog được gọi trước NonMarineMammal hoặc NoneWingedMammal. Hai lớp này được gọi trước Mammal, được gọi trước Animal và lớp Animal được gọi trước đối tượng.
  • Nếu có nhiều bậc cha mẹ thích Dog(NonMarineMammal, NonWingedMammal), các phương thức của NonMarineMammal được gọi trước vì nó xuất hiện trước.

Để tìm hiểu thêm super(), hãy truy cập super () được coi là siêu của Python!

thú vị bài viết...