Super() Magic dalam Python 3.x
Dalam Python 3.x, fungsi super() mempunyai keupayaan unik: ia boleh dipanggil tanpa sebarang hujah. Tingkah laku ini, walaupun pada mulanya mengejutkan, berpunca daripada pilihan reka bentuk yang disengajakan yang diperkenalkan untuk menangani masalah pengaturcaraan biasa.
Mengelakkan Pelanggaran KERING dan Kesamaran Nama Kelas
Sebelum Python 3 .x, penamaan kelas secara eksplisit diperlukan apabila menggunakan super(), seperti yang ditunjukkan dalam coretan kod berikut:
<code class="python">class Foo(Bar): def baz(self): return super(Foo, self).baz() + 42</code>
Walau bagaimanapun, pendekatan ini melanggar prinsip DRY dan terdedah kepada kesamaran nama kelas yang disebabkan oleh penghias semula atau penghias kelas global. Untuk mengurangkan isu ini, Python 3.x memperkenalkan pelaksanaan ajaib super().
Memanfaatkan Kelas Sel untuk Resolusi Masa Jalan
pelaksanaan semasa super() menggunakan sel kelas. Sel ini menyediakan akses kepada objek kelas asal, membolehkan super() menyelesaikan superclass pada masa jalan tanpa memerlukan penamaan kelas yang jelas. Akibatnya, kod berikut berfungsi seperti yang dimaksudkan, walaupun Foo ditugaskan semula:
<code class="python">class Foo(Bar): def baz(self): return super().baz() + 42 Spam = Foo Foo = something_else() Spam().baz() # still works</code>
Butiran Kompromi dan Pelaksanaan
Pada mulanya, super() telah dicadangkan sebagai kata kunci, tetapi kebimbangan tentang persepsinya sebagai "terlalu ajaib" membawa kepada pelaksanaan semasa. Guido van Rossum sendiri mengiktiraf potensi kekaburan menggunakan nama yang berbeza untuk super().
Potensi Kelemahan
Walaupun tingkah laku ajaib super() umumnya bermanfaat, ia boleh membawa kepada hasil yang tidak dijangka jika superclass diubah suai secara dinamik atau jika super() dinamakan semula. Dalam senario sedemikian, adalah dinasihatkan untuk merujuk pembolehubah kelas secara eksplisit dalam kaedah untuk memastikan kefungsian yang betul.
Contoh Alternatif Fungsi yang Dipengaruhi oleh Penamaan Semula
Fungsi dan kaedah Python lain yang boleh dipengaruhi oleh penamaan semula termasuk:
Atas ialah kandungan terperinci Bagaimanakah `super()` Mengerjakan Keajaibannya dalam Python 3.x Tanpa Sebarang Hujah?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!