Java dan C ++ mengharuskan konstruktor kelas dasar dipanggil karena tata letak memori.
Jika Anda memiliki kelas BaseClass
dengan anggota field1
, dan Anda membuat kelas baru SubClass
yang menambahkan anggota field2
, maka instance SubClass
berisi ruang untuk field1
dan field2
. Anda memerlukan konstruktor BaseClass
untuk diisi field1
, kecuali Anda mengharuskan semua kelas pewarisan untuk mengulang BaseClass
inisialisasi pada konstruktor mereka sendiri. Dan jika field1
bersifat pribadi, maka mewarisi kelas tidak dapat diinisialisasi field1
.
Python bukan Java atau C ++. Semua instance dari semua kelas yang ditentukan pengguna memiliki 'bentuk' yang sama. Mereka pada dasarnya hanya kamus di mana atribut dapat dimasukkan. Sebelum inisialisasi dilakukan, semua instance dari semua kelas yang ditentukan pengguna hampir persis sama ; mereka hanya tempat untuk menyimpan atribut yang belum menyimpan apa pun.
Jadi masuk akal bagi subclass Python untuk tidak memanggil konstruktor kelas dasarnya. Itu bisa saja menambahkan atribut itu sendiri jika mau. Tidak ada ruang yang disediakan untuk sejumlah bidang tertentu untuk setiap kelas dalam hierarki, dan tidak ada perbedaan antara atribut yang ditambahkan oleh kode dari suatu BaseClass
metode dan atribut yang ditambahkan oleh kode dari suatu SubClass
metode.
Jika, seperti biasa, SubClass
sebenarnya ingin semua BaseClass
invarian diatur sebelum melanjutkan untuk melakukan kustomisasi sendiri, maka ya Anda bisa memanggil BaseClass.__init__()
(atau menggunakan super
, tapi itu rumit dan terkadang memiliki masalah sendiri). Tetapi Anda tidak harus melakukannya. Dan Anda dapat melakukannya sebelum, atau setelah, atau dengan berbagai argumen. Sial, jika Anda mau, Anda dapat memanggil BaseClass.__init__
dari metode lain sepenuhnya dari __init__
; mungkin Anda memiliki beberapa hal inisialisasi malas malas terjadi.
Python mencapai fleksibilitas ini dengan menjaga hal-hal sederhana. Anda menginisialisasi objek dengan menulis __init__
metode yang menetapkan atribut self
. Itu dia. Itu berperilaku persis seperti metode, karena itu adalah metode. Tidak ada aturan aneh dan tidak intuitif lainnya tentang hal-hal yang harus dilakukan terlebih dahulu, atau hal-hal yang secara otomatis akan terjadi jika Anda tidak melakukan hal-hal lain. Satu-satunya tujuan yang perlu dilayaninya adalah menjadi pengait untuk dieksekusi selama inisialisasi objek untuk menetapkan nilai atribut awal, dan tidak hanya itu. Jika Anda ingin melakukan hal lain, Anda secara eksplisit menuliskannya dalam kode Anda.
__init__
metode ini, dan bahkan mungkin secara otomatis mencari subkelas dan menghiasnya.