"__init__()" dan "__new__()": Urutan dan Tujuan
"__init__()" dan "__new__()" ialah kaedah asas dalam pengaturcaraan berorientasikan objek Python yang digunakan untuk mengawal penciptaan contoh dan permulaan.
"__new__()" bertanggungjawab untuk memperuntukkan memori dan mencipta tika baharu kelas, mengembalikan objek yang baru dibuat. Ia bertanggungjawab untuk penciptaan sebenar tika.
Sebaliknya, "__init__()" memulakan tika yang baru dibuat. Ia bertanggungjawab untuk menyediakan atribut instance dan melakukan sebarang tindakan yang diperlukan untuk menyediakan objek untuk digunakan.
Reka bentuk Python menentukan bahawa "__init__()" sentiasa dipanggil selepas "__new__()" dalam proses penciptaan instance . Ini kerana kejadian baharu perlu dimulakan selepas ia dibuat.
Corak Flyweight dan "__init__()" Invocation
Dalam konteks corak Flyweight , anda mungkin keliru tentang kelakuan yang dijangkakan "__init__()" dipanggil selepas "__new__()". Ini kerana corak Flyweight biasanya menggunakan "__new__()" untuk mengawal penciptaan instance dan mengelak daripada membuat berbilang salinan objek yang sama.
Dalam kod contoh anda, anda telah melaksanakan kaedah "__new__()" tersuai untuk mengendalikan penciptaan instance berdasarkan kewujudan kunci dalam kamus. Walau bagaimanapun, anda mungkin ingin kaedah "__init__()" dipanggil sekali sahaja, walaupun untuk kejadian berikutnya dibuat menggunakan corak Flyweight.
Mengapa "__init__()" Sentiasa Dipanggil Selepas " __new__()"?
Sebab bagi tingkah laku ini ialah sistem berorientasikan objek Python menjangkakan setiap kejadian yang dibuat akan dimulakan melalui panggilan kepada "__init__()". Ini adalah bahagian asas dalam proses penciptaan contoh, memastikan objek disediakan sepenuhnya untuk digunakan.
Pelaksanaan Alternatif
Untuk melaksanakan corak Flyweight dan elakkan daripada memanggil " __init__()" beberapa kali, anda harus menggunakan kelas kilang dan bukannya mengatasi "__new__()". Ini dianggap sebagai pendekatan yang lebih mantap dan standard.
Berikut ialah contoh pelaksanaan Flyweight berasaskan kilang:
class FlyweightFactory: _cache = {} def __get(key): if key not in FlyweightFactory._cache: FlyweightFactory._cache[key] = Flyweight(key) return FlyweightFactory._cache[key] class Flyweight: def __init__(self, key): self.key = key
Dalam pelaksanaan ini, kelas kilang mencipta dan menyimpan contoh berdasarkan kunci, mengelakkan keperluan untuk berbilang panggilan "__init__()".
Atas ialah kandungan terperinci Mengapakah `__init__()` Sentiasa Dipanggil Selepas `__new__()` dalam Penciptaan Objek Python?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!