Warisan memang berguna, tetapi Anda dapat membuka potensi penuhnya dengan menggunakan kembali kode dari kelas dasar.

Poin Penting

  • Fungsi super() Python memungkinkan Anda memanggil metode superkelas dari subkelas, membuatnya lebih mudah untuk mengimplementasikan pewarisan dan penggantian metode.
  • Fungsi super() terkait erat dengan Urutan Resolusi Metode (MRO) dengan Python, yang menentukan urutan pencarian metode atau atribut di kelas leluhur.
  • Menggunakan super() di konstruktor kelas adalah praktik umum untuk menginisialisasi atribut umum di kelas induk dan atribut yang lebih spesifik di kelas anak. Gagal menggunakan super() dapat menyebabkan konsekuensi yang tidak diinginkan, seperti hilangnya inisialisasi atribut.

Salah satu fitur inti Python adalah paradigma OOP-nya, yang dapat Anda gunakan untuk memodelkan entitas dunia nyata dan hubungannya.

Saat bekerja dengan kelas Python, Anda akan sering menggunakan pewarisan dan mengganti atribut atau metode superkelas. Python menyediakan a super() fungsi yang memungkinkan Anda memanggil metode superkelas dari subkelas.

instagram viewer

Apa itu super() dan Mengapa Anda Membutuhkannya?

Dengan menggunakan pewarisan, Anda bisa membuat kelas Python baru yang mewarisi fitur kelas yang sudah ada. Anda juga dapat mengganti metode superkelas di subkelas, memberikan implementasi alternatif. Namun, Anda mungkin ingin menggunakan fungsi baru sebagai tambahan dari fungsi lama, bukan sebagai gantinya. Pada kasus ini, super() berguna.

Anda dapat menggunakan super() berfungsi untuk mengakses atribut superclass dan memanggil metode superclass. Super sangat penting untuk pemrograman berorientasi objek karena memudahkan penerapan pewarisan dan penggantian metode.

Bagaimana cara super() Bekerja?

Secara internal, super() berkaitan erat dengan Urutan Resolusi Metode (MRO) dengan Python, yang ditentukan oleh algoritma Linearisasi C3.

Begini caranya super() bekerja:

  1. Tentukan kelas dan instance saat ini: Saat Anda menelepon super() di dalam metode subkelas, Python secara otomatis mengetahui kelas saat ini (kelas yang berisi metode yang dipanggil super()) dan turunan dari kelas itu (yaitu, diri sendiri).
  2. Tentukan superkelasnya: super() membutuhkan dua argumen—kelas saat ini dan instance—yang tidak perlu Anda sampaikan secara eksplisit. Ia menggunakan informasi ini untuk menentukan superclass untuk mendelegasikan pemanggilan metode. Hal ini dilakukan dengan memeriksa hierarki kelas dan MRO.
  3. Panggil metode di Superclass: Setelah ditentukan superclassnya, super() memungkinkan Anda memanggil metodenya seolah-olah Anda memanggilnya langsung dari subkelas. Hal ini memungkinkan Anda untuk memperluas atau mengganti metode sambil tetap menggunakan implementasi asli dari superclass.

Menggunakan super() di Konstruktor Kelas

Menggunakan super() dalam konstruktor kelas adalah praktik umum, karena Anda sering kali ingin menginisialisasi atribut umum di kelas induk dan atribut yang lebih spesifik di kelas turunan.

Untuk menunjukkan hal ini, mendefinisikan kelas Python, Ayah, yang a Putra kelas mewarisi dari:

classFather:
def__init__(self, first_name, last_name):
self.first_name = first_name
self.last_name = last_name

classSon(Father):
def__init__(self, first_name, last_name, age, hobby):
# Call the parent class constructor (Father)
super().__init__(first_name, last_name)

self.age = age
self.hobby = hobby

defget_info(self):
returnf"Son's Name: {self.first_name}{self.last_name}, \
Son's Age: {self.age}, Son's Hobby: {self.hobby}"

# Create an instance of the Son class
son = Son("Pius", "Effiong", 25, "Playing Guitar")

# Access attributes
print(son.get_info())

Di dalam Putra konstruktor, panggilan ke super().init() memanggil Ayah konstruktor kelas, meneruskannya nama depan Dan nama keluarga sebagai parameter. Hal ini memastikan bahwa Ayah kelas masih dapat mengatur nama atribut dengan benar, bahkan pada a Putra obyek.

Jika Anda tidak menelepon super() dalam konstruktor kelas, konstruktor kelas induknya tidak akan berjalan. Hal ini dapat menyebabkan konsekuensi yang tidak diinginkan, seperti inisialisasi atribut yang hilang atau penyiapan status kelas induk yang tidak lengkap:

...
classSon(Father):
def__init__(self, first_name, last_name, age, hobby):
self.age = age
self.hobby = hobby
...

Jika sekarang Anda mencoba menelepon Mendapatkan informasi metode, itu akan meningkatkan Kesalahan Atribut karena diri.nama_pertama Dan diri.nama_belakang atribut belum diinisialisasi.

Menggunakan super() dalam Metode Kelas

Anda dapat gunakan super() dalam metode lain, selain konstruktor, dengan cara yang sama. Hal ini memungkinkan Anda memperluas atau mengganti perilaku metode superkelas.

classFather:
defspeak(self):
return"Hello from Father"

classSon(Father):
defspeak(self):
# Call the parent class's speak method using super()
parent_greeting = super().speak()
returnf"Hello from Son\n{parent_greeting}"

# Create an instance of the Son class
son = Son()

# Call the speak method of the Son class
son_greeting = son.speak()

print(son_greeting)

Itu Putra kelas mewarisi dari Ayah dan memilikinya berbicara metode. Itu berbicara metode Putra kegunaan kelas super().berbicara() untuk menelepon berbicara metode Ayah kelas. Hal ini memungkinkannya untuk menyertakan pesan dari kelas induk sambil memperluasnya dengan pesan khusus untuk kelas anak.

Gagal digunakan super() dalam metode yang mengesampingkan metode lain berarti fungsionalitas yang ada dalam metode kelas induk tidak akan berpengaruh. Hal ini mengakibatkan penggantian menyeluruh atas perilaku metode, yang dapat mengakibatkan perilaku yang tidak Anda inginkan.

Memahami Metode Resolusi Urutan

Urutan Resolusi Metode (MRO) adalah urutan pencarian Python di kelas leluhur saat Anda mengakses metode atau atribut. MRO membantu Python menentukan metode mana yang akan dipanggil ketika ada banyak hierarki warisan.

classNigeria():
defculture(self):
print("Nigeria's culture")

classAfrica():
defculture(self):
print("Africa's culture")

Inilah yang terjadi saat Anda membuat instance dari Lagos kelas dan menelepon budaya metode:

  1. Python memulai dengan mencari budaya metode di Lagos kelas itu sendiri. Jika ia menemukannya, ia akan memanggil metode tersebut. Jika tidak, lanjutkan ke langkah kedua.
  2. Jika tidak menemukan budaya metode di Lagos kelas, Python melihat kelas dasar sesuai urutan kemunculannya dalam definisi kelas. Pada kasus ini, Lagos mewarisi pertama dari Afrika dan kemudian dari Nigeria. Jadi, Python akan mencarinya budaya metode di Afrika Pertama.
  3. Jika tidak menemukan budaya metode di Afrika kelas, Python kemudian akan mencari di Nigeria kelas. Perilaku ini berlanjut hingga mencapai akhir hierarki dan menimbulkan kesalahan jika tidak dapat menemukan metode di superkelas mana pun.

Outputnya menunjukkan Urutan Resolusi Metode Lagos, dimulai dari kiri ke kanan.

Kesalahan Umum dan Praktik Terbaik

Saat bekerja dengan super(), ada beberapa kendala umum yang harus dihindari.

  1. Perhatikan Urutan Resolusi Metode, terutama dalam skenario pewarisan berganda. Jika Anda perlu menggunakan pewarisan berganda yang kompleks, Anda harus memahaminya Algoritma Linearisasi C3 yang digunakan Python untuk menentukan MRO.
  2. Hindari ketergantungan melingkar dalam hierarki kelas Anda, yang dapat menyebabkan perilaku tidak terduga.
  3. Dokumentasikan kode Anda dengan jelas, terutama saat menggunakan super() dalam hierarki kelas yang kompleks, agar lebih mudah dipahami oleh pengembang lain.

Gunakan super() dengan Cara yang Benar

ular piton super() function adalah fitur canggih saat Anda bekerja dengan pewarisan dan penggantian metode. Memahami caranya super() berfungsi dan mengikuti praktik terbaik akan memungkinkan Anda membuat kode yang lebih mudah dipelihara dan efisien dalam proyek Python Anda.