Saya sedang membaca 'Dive Into Python' dan dalam bab tentang kelas-kelas itu memberikan contoh ini:
class FileInfo(UserDict):
"store file metadata"
def __init__(self, filename=None):
UserDict.__init__(self)
self["name"] = filename
Penulis kemudian mengatakan bahwa jika Anda ingin mengganti __init__
metode, Anda harus secara eksplisit memanggil induk __init__
dengan parameter yang benar.
- Bagaimana jika
FileInfo
kelas itu memiliki lebih dari satu kelas leluhur?- Apakah saya harus secara eksplisit memanggil semua
__init__
metode kelas leluhur ?
- Apakah saya harus secara eksplisit memanggil semua
- Juga, apakah saya harus melakukan ini pada metode lain yang ingin saya timpa?
python
overriding
superclass
liewl
sumber
sumber
Jawaban:
Buku ini sedikit tertanggal sehubungan dengan panggilan subclass-superclass. Ini juga sedikit tanggal sehubungan dengan subkelas kelas built-in.
Sepertinya ini saat ini:
Perhatikan yang berikut ini:
Kita bisa langsung subclass built-in kelas, seperti
dict
,list
,tuple
, dllThe
super
menangani fungsi melacak superclasses ini kelas dan memanggil fungsi di dalamnya secara tepat.sumber
Di setiap kelas yang Anda butuhkan untuk mewarisi, Anda dapat menjalankan satu lingkaran dari setiap kelas yang perlu diinisiasi saat memulai kelas anak ... contoh yang dapat disalin mungkin lebih baik dipahami ...
sumber
Child.__init__
diperlukan for for loop . Ketika saya menghapusnya dari contoh saya masih anak mencetak "Nenek". Bukankah kakek nenek tidak ditangani olehParent
kelas?Anda tidak benar - benar harus memanggil
__init__
metode kelas dasar (es), tetapi Anda biasanya ingin melakukannya karena kelas dasar akan melakukan beberapa inisialisasi penting di sana yang diperlukan agar metode kelas lainnya bekerja.Untuk metode lain, itu tergantung pada niat Anda. Jika Anda hanya ingin menambahkan sesuatu ke perilaku kelas dasar Anda akan ingin memanggil metode kelas dasar tambahan ke kode Anda sendiri. Jika Anda ingin secara mendasar mengubah perilaku, Anda mungkin tidak memanggil metode kelas dasar dan mengimplementasikan semua fungsi secara langsung di kelas turunan.
sumber
Jika kelas FileInfo memiliki lebih dari satu kelas leluhur maka Anda harus memanggil semua fungsi __init __ () mereka. Anda juga harus melakukan hal yang sama untuk fungsi __del __ (), yang merupakan destruktor.
sumber
Ya, Anda harus menelepon
__init__
untuk setiap kelas induk. Hal yang sama berlaku untuk fungsi, jika Anda mengganti fungsi yang ada di kedua orang tua.sumber