Rumah > pembangunan bahagian belakang > Tutorial Python > Mengapakah `__init__()` Sentiasa Dipanggil Selepas `__new__()` dalam Penciptaan Objek Python?

Mengapakah `__init__()` Sentiasa Dipanggil Selepas `__new__()` dalam Penciptaan Objek Python?

DDD
Lepaskan: 2024-12-19 15:47:11
asal
542 orang telah melayarinya

Why is `__init__()` Always Called After `__new__()` in Python's Object Creation?

"__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
Salin selepas log masuk

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!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan