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
435 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!

sumber:php.cn
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