Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimanakah `super()` Mengerjakan Keajaibannya dalam Python 3.x Tanpa Sebarang Hujah?

Bagaimanakah `super()` Mengerjakan Keajaibannya dalam Python 3.x Tanpa Sebarang Hujah?

Patricia Arquette
Patricia Arquetteasal
2024-10-27 02:12:30216semak imbas

 How Does `super()` Work Its Magic in Python 3.x Without Any Arguments?

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:

  • type()
  • isinstance()
  • issubclass()
  • harta()
  • kaedah kelas()
  • kaedah statik()

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!

Kenyataan:
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