Python super ()

Super () builtin mengembalikan objek proksi (objek sementara superclass) yang membolehkan kita mengakses kaedah kelas asas.

Di Python, super()mempunyai dua kes penggunaan utama:

  • Membolehkan kita mengelakkan penggunaan nama kelas asas dengan jelas
  • Bekerja dengan Warisan Pelbagai

Contoh 1: super () dengan Warisan Tunggal

Dalam kes warisan tunggal, ini membolehkan kita merujuk kelas asas dengan 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()

Pengeluaran

Anjing mempunyai empat kaki. Anjing adalah haiwan berdarah panas.

Di sini, kami memanggil __init__()kaedah kelas Mamalia (dari kelas Anjing) menggunakan kod

 super () .__ init __ ('Anjing')

bukannya

 Mamalia .__ init __ (diri, 'Anjing')

Oleh kerana kita tidak perlu menentukan nama kelas asas ketika kita memanggil anggotanya, kita boleh menukar nama kelas asas dengan mudah (jika kita perlu).

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

The super()builtin mengembalikan objek proksi, objek gantian yang boleh memanggil kaedah kelas asas melalui delegasi. Ini disebut tidak langsung (kemampuan untuk merujuk objek asas dengan super())

Oleh kerana pengalihan dihitung pada waktu berjalan, kita dapat menggunakan kelas asas yang berlainan pada waktu yang berlainan (jika kita perlu).

Contoh 2: super () dengan Warisan Berganda

 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')

Pengeluaran

Anjing mempunyai 4 kaki. Anjing tidak boleh berenang. Anjing tidak boleh terbang. Anjing adalah haiwan berdarah panas. Anjing adalah haiwan. Kelawar tidak boleh berenang. Kelawar adalah haiwan berdarah panas. Kelawar adalah haiwan.

Perintah Penyelesaian Kaedah (MRO)

Kaedah Penyelesaian Kaedah (MRO) adalah urutan di mana kaedah harus diwarisi sekiranya terdapat banyak warisan. Anda boleh melihat MRO dengan menggunakan __mro__atribut.

 >>> Anjing .__ mro__ (,,,,,)

Inilah cara MRO berfungsi:

  • Kaedah dalam panggilan berasal selalu dipanggil sebelum kaedah kelas asas.
    Dalam contoh kami, kelas Dog dipanggil sebelum NonMarineMammal atau NoneWingedMammal. Kedua kelas ini disebut sebelum Mamalia, yang disebut sebelum Haiwan, dan kelas Haiwan disebut sebelum objek.
  • Sekiranya terdapat banyak ibu bapa seperti Dog(NonMarineMammal, NonWingedMammal), kaedah NonMarineMammal dipanggil terlebih dahulu kerana ia muncul terlebih dahulu.

Untuk mengetahui lebih lanjut mengenai super(), lawati Python super () yang dianggap super!

Artikel menarik...