Mengapa Kaedah Tidak Mempamerkan Kesamaan Rujukan dalam Python?

Barbara Streisand
Lepaskan: 2024-10-30 00:00:29
asal
967 orang telah melayarinya

Why Do Methods Not Exhibit Reference Equality in Python?

Mengapa Kaedah Tidak Menunjukkan Kesamaan Rujukan?

Dalam Python, sementara fungsi mengekalkan kesamaan rujukan, kaedah tidak. Perbezaan ini berpunca daripada cara kaedah dicipta.

Penciptaan Kaedah

Berbeza dengan fungsi, objek kaedah dibuat seketika setiap kali ia diakses. Ini kerana kaedah pada asasnya adalah deskriptor, yang mengembalikan objek kaedah apabila kaedah .__get__ mereka digunakan.

What.__dict__['meth']  # Function (not method) object
What.__dict__['meth'].__get__(What(), What)  # Method object
Salin selepas log masuk

Pengujian Kesamaan Kaedah

Dalam Python 3.8 dan lebih baru , kesamaan kaedah ditentukan dengan membandingkan atribut .__self__ dan .__func__. Jika mereka merujuk kepada fungsi dan contoh yang sama, kaedah tersebut dianggap sama. Walau bagaimanapun, sebelum 3.8, tingkah laku kesamaan kaedah tidak konsisten bergantung pada pelaksanaan kaedah.

Implikasi

Kebolehubahan dalam kesamaan kaedah ini mempengaruhi beberapa senario:

  • Apabila menggunakan operator is untuk menyemak sama ada kaedah adalah sama, ia mengembalikan False melainkan kaedah terikat pada contoh dan fungsi yang sama.
  • Sebaliknya, == ujian kesamaan untuk kaedah dalam Python 3.8 memberikan hasil yang diharapkan dengan membandingkan atribut .__self__ dan .__func__.

Penyelesaian untuk Menguji Identiti Fungsi

Untuk menguji sama ada kaedah mewakili fungsi asas yang sama, anda boleh membandingkan atribut .__func__ mereka:

What().meth.__func__ == What().meth.__func__
Salin selepas log masuk

Atas ialah kandungan terperinci Mengapa Kaedah Tidak Mempamerkan Kesamaan Rujukan dalam Python?. 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!