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!