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 Cinstance baru .
Tujuan dari penginisialisasi C.__init__adalah untuk menentukan inisialisasi kustom dari setiap instance Csetelah 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 Testmemiliki atribut yang xsama 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 xatribut 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 (lihatbooluntuk 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.