Mengapakah `super()` Python 3.x Mempunyai Gelagat \'Magic\' Ini dan Bilakah Ia Boleh Membawa kepada Ralat?

Barbara Streisand
Lepaskan: 2024-10-26 12:18:29
asal
556 orang telah melayarinya

  Why Does Python 3.x's `super()` Have This

Mengapa Python 3.x's super() Boleh Melakukan Sihir

Dalam Python 3.x, fungsi super() boleh digunakan tanpa hujah. Ini membolehkan penyeruan superclass yang dipermudahkan dan dipertingkatkan, seperti yang ditunjukkan di bawah:

<code class="python">class A(object):
    def x(self):
         print("Hey now")

class B(A):
    def x(self):
        super().x()

B().x()  # Outputs: "Hey now"</code>
Salin selepas log masuk

Fungsi ini dicapai melalui sihir masa kompilasi, yang memastikan super() mempunyai akses kepada superclass yang betul semasa masa jalan. Walau bagaimanapun, tingkah laku ini juga boleh membawa kepada ralat yang tidak dijangka apabila super() dilantunkan kepada nama lain, seperti yang digambarkan di bawah:

<code class="python">super_ = super

class A(object):
    def x(self):
        print("No flipping")

class B(A):
    def x(self):
        super_().x()

B().x()  # Raises: RuntimeError: super(): __class__ cell not found</code>
Salin selepas log masuk

Menyingkap Kerja Dalaman super()

Keajaiban di sebalik super() terletak pada sel kelas masa kompilasi yang dicipta apabila super atau kelas dirujuk dalam kaedah. Sel ini menyediakan super() dengan akses kepada objek kelas asal, walaupun nama kelas telah dipantulkan semula.

Mekanisme sel kelas ini diperkenalkan untuk mengelakkan ralat yang disebabkan oleh menamakan kelas secara eksplisit apabila menggunakan super() atau menggunakan penghias kelas yang mengembalikan objek kelas baharu. Ia juga mengelakkan salah guna super(), seperti seruan menggunakan super(type(self), self) atau super(self.__class__, self), yang boleh membawa kepada rekursi tak terhingga.

Praktikal Aplikasi dan Gotchas

Walaupun sel kelas menambah kemudahan, ia juga boleh membawa kepada tingkah laku yang tidak dijangka dalam senario tertentu. Contohnya, jika super() dilantunkan kepada nama lain (cth., super_ seperti yang ditunjukkan sebelum ini) dan kaedah itu tidak merujuk kelas secara eksplisit, panggilan super() akan gagal.

Satu lagi contoh di mana mengetahui tentang mekanisme asas boleh memberi manfaat ialah apabila menggunakan penghias kelas. Jika penghias mengembalikan objek kelas baharu, sel kelas akan terus merujuk kepada kelas asal, memastikan seruan superclass yang betul.

Perlu diperhatikan bahawa mengikat semula fungsi, kaedah atau kelas dalam Python juga boleh membawa kepada tingkah laku yang tidak dijangka. Walau bagaimanapun, super() ialah contoh yang ketara kerana peranan utamanya dalam pengaturcaraan berorientasikan objek.

Atas ialah kandungan terperinci Mengapakah `super()` Python 3.x Mempunyai Gelagat \'Magic\' Ini dan Bilakah Ia Boleh Membawa kepada Ralat?. 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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!