Mengapa Kaedah dalam Python Kurang Rujukan Kesamaan?

DDD
Lepaskan: 2024-10-27 15:53:02
asal
392 orang telah melayarinya

 Why Do Methods in Python Lack Reference Equality?

Kesamaan Rujukan Kaedah dalam Python: Membongkar Misteri

Mengapakah kaedah, yang seolah-olah diberikan warisan daripada fungsi biasa, tidak mempunyai kebaikan rujukan kesamarataan? Fenomena yang membingungkan ini telah membingungkan ramai pengaturcara Python. Mari kita mendalami mekanisme asas untuk memahami sebab di sebalik perbezaan ini.

Tidak seperti fungsi biasa, yang mengekalkan identiti objeknya sepanjang program, objek kaedah dicipta secara dinamik apabila diakses. Sifat fana ini berpunca daripada pergantungan mereka pada deskriptor, yang menjana objek kaedah apabila kaedah .__get__ mereka digunakan. Coretan kod dengan tepat menggambarkan tingkah laku ini:

<code class="python">>>> What.__dict__['meth']
<function What.meth at 0x10a6f9c80>
>>> What.__dict__['meth'].__get__(What(), What)
<bound method What.meth of <__main__.What object at 0x10a6f7b10>></code>
Salin selepas log masuk

Bermula dengan Python 3.8, ujian kesamaan untuk kaedah telah menjadi konsisten dan boleh diramal. Dua kaedah dianggap sama jika kedua-dua atribut .__self__ (contoh mereka terikat) dan .__func__ (fungsi asas) ialah objek yang sama.

Walau bagaimanapun, gelagat yang konsisten ini adalah penambahan terbaru. Sebelum Python 3.8, kesamaan kaedah berbeza-beza bergantung pada butiran pelaksanaannya. Untuk kaedah Python dan jenis kaedah C tertentu, diri dibandingkan untuk kesaksamaan, manakala untuk jenis kaedah C yang lain, diri dibandingkan dengan identiti. Ketidakkonsistenan ini akhirnya ditangani dalam isu Python 1617161.

Untuk memastikan konsistensi, adalah disyorkan untuk mengesahkan identiti kaedah menggunakan atribut func mereka:

<code class="python">>>> What.meth == What.meth     # functions (or unbound methods in Python 2)
True
>>> What().meth == What.meth   # bound method and function
False
>>> What().meth == What().meth # bound methods with *different* instances
False
>>> What().meth.__func__ == What().meth.__func__ # functions
True</code>
Salin selepas log masuk

Ringkasnya, kefanaan objek kaedah, ditambah dengan ketidakkonsistenan sejarah dalam kesamaan kaedah, telah menyebabkan ketiadaan kesamaan rujukan untuk kaedah. Walau bagaimanapun, Python 3.8 memperkenalkan pendekatan yang lebih konsisten dan boleh diramal, membolehkan pengaturcara membuat alasan tentang kesamaan kaedah dengan lebih yakin.

Atas ialah kandungan terperinci Mengapa Kaedah dalam Python Kurang Rujukan Kesamaan?. 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
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!