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