Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapa Kaedah Tidak Mempamerkan Kesamaan Rujukan dalam Python?

Mengapa Kaedah Tidak Mempamerkan Kesamaan Rujukan dalam Python?

Barbara Streisand
Barbara Streisandasal
2024-10-30 00:00:291022semak imbas

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

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__

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!

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