Mengapa konstruktor memang disebut "Konstruktor"? Apa tujuan mereka dan apa perbedaannya dengan metode di kelas?
Juga, bisakah ada lebih dari satu __init__
di kelas? Saya mencoba yang berikut ini, dapatkah seseorang menjelaskan hasilnya?
>>> class test:
def __init__(self):
print "init 1"
def __init__(self):
print "init 2"
>>> s=test()
init 2
Terakhir, apakah __init__
operator overloader?
__init__
adalah inisial . Konstruktor python adalah__new__
. Python menggunakan inisialisasi dua fase otomatis -__new__
mengembalikan objek yang valid tetapi (biasanya) tidak berpenghuni (lihatbool
untuk contoh kontra), yang kemudian__init__
memanggilnya secara otomatis. Ini menghindari masalah yang dimiliki bahasa seperti C ++ dengan objek yang dibuat sebagian - Anda tidak pernah memilikinya di Python (meskipun mungkin diinisialisasi sebagian). Anda hampir tidak perlu mengganti keduanya__new__
dan__init__
di kelas.Jawaban:
Tidak ada fungsi yang berlebihan dalam Python, artinya Anda tidak dapat memiliki banyak fungsi dengan nama yang sama tetapi dengan argumen yang berbeda.
Dalam contoh kode Anda, Anda tidak kelebihan beban
__init__()
. Apa yang terjadi adalah definisi kedua me - rebinds nama__init__
ke metode baru, membuat metode pertama tidak dapat diakses.Mengenai pertanyaan umum Anda tentang konstruktor, Wikipedia adalah titik awal yang baik. Untuk hal-hal khusus Python, saya sangat merekomendasikan dokumen Python .
sumber
__init__
adalah yang akan berakhir di kelas.Mengapa konstruktor memang disebut "Konstruktor"?
Konstruktor (bernama
__new__
) membuat dan mengembalikan instance baru dari kelas. JadiC.__new__
metode kelas adalah konstruktor untuk kelas C.The
C.__init__
metode contoh disebut pada contoh tertentu, setelah dibuat, untuk menginisialisasinya sebelum berlalu kembali ke pemanggil. Jadi metode itu adalah penginisialisasi untuk contoh baru C.Apa perbedaannya dengan metode di kelas?
Seperti yang tercantum dalam dokumentasi resmi
__init__
yang disebut setelah instance dibuat . Metode lain tidak menerima perawatan ini.Apa tujuan mereka?
Tujuan konstruktor
C.__new__
adalah untuk menentukan perilaku kustom selama konstruksiC
instance baru .Tujuan dari penginisialisasi
C.__init__
adalah untuk menentukan inisialisasi kustom dari setiap instanceC
setelah dibuat.Misalnya Python memungkinkan Anda melakukan:
Tetapi jika Anda ingin setiap instance
Test
memiliki atribut yangx
sama dengan 10, Anda dapat memasukkan kode itu di dalam__init__
:Setiap metode instance (metode yang dipanggil pada instance tertentu dari kelas) menerima instance tersebut sebagai argumen pertamanya. Argumen itu dinamai secara konvensional
self
.Metode kelas, seperti konstruktor
__new__
, menerima kelas sebagai argumen pertama mereka.Sekarang, jika Anda menginginkan nilai khusus untuk
x
atribut yang harus Anda lakukan adalah meneruskan nilai itu sebagai argumen ke__init__
:Saya harap ini akan membantu Anda menghilangkan beberapa keraguan, dan karena Anda sudah menerima jawaban yang baik untuk pertanyaan lain, saya akan berhenti di sini :)
sumber
Kelas hanyalah cetak biru untuk membuat objek. Konstruktor adalah beberapa kode yang dijalankan setiap kali Anda membuat objek. Oleh karena itu tidak masuk akal untuk memiliki dua konstruktor. Apa yang terjadi adalah bahwa yang kedua menulis yang pertama.
Apa yang biasanya Anda gunakan untuk membuat variabel untuk objek itu seperti ini:
Jadi yang dapat Anda lakukan adalah membuat objek dari kelas ini seperti ini:
Objek uji kemudian akan memiliki objek yang disebut
some_value
yang dalam sampel ini akan menjadi 5.Tetapi Anda tidak perlu menetapkan nilai untuk setiap objek seperti yang saya lakukan dalam sampel saya. Anda juga bisa melakukan seperti ini:
maka nilai some_value akan menjadi 5 dan Anda tidak perlu menyetelnya saat membuat objek.
yang >>> dan ... dalam sampel saya bukanlah apa yang Anda tulis. Ini akan terlihat di pyshell ...
sumber
coonstructors dipanggil secara otomatis saat Anda membuat objek baru, dengan demikian "membangun" objek. Alasan Anda dapat memiliki lebih dari satu init adalah karena nama hanyalah referensi di python, dan Anda diizinkan untuk mengubah apa yang setiap referensi variabel kapan pun Anda mau (karenanya pengetikan dinamis)
dalam definisi kelas Anda, itu hanya menyimpan yang terakhir
sumber
Tidak ada gagasan metode overloading dengan Python. Tapi Anda bisa mencapai efek serupa dengan menentukan argumen opsional dan kata kunci
sumber