Mengapa konstruktor memang disebut "Konstruktor"?
Konstruktor (bernama __new__
) membuat dan mengembalikan instance baru dari kelas. Jadi C.__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 konstruksi C
instance baru .
Tujuan dari penginisialisasi C.__init__
adalah untuk menentukan inisialisasi kustom dari setiap instance C
setelah dibuat.
Misalnya Python memungkinkan Anda melakukan:
class Test(object):
pass
t = Test()
t.x = 10 # here you're building your object t
print t.x
Tetapi jika Anda ingin setiap instance Test
memiliki atribut yang x
sama dengan 10, Anda dapat memasukkan kode itu di dalam __init__
:
class Test(object):
def __init__(self):
self.x = 10
t = Test()
print t.x
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__
:
class Test(object):
def __init__(self, x):
self.x = x
t = Test(10)
print t.x
z = Test(20)
print t.x
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 :)
__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.