Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapa Kaedah Python Tidak Sama, Walaupun Ia Merujuk kepada Fungsi Asas yang Sama?

Mengapa Kaedah Python Tidak Sama, Walaupun Ia Merujuk kepada Fungsi Asas yang Sama?

Barbara Streisand
Barbara Streisandasal
2024-10-29 04:59:29859semak imbas

 Why are Python Methods Not Equal, Even if They Refer to the Same Underlying Function?

Kesamaan Rujukan Kaedah dalam Python

Dalam Python, kaedah ialah objek unik yang dicipta secara dinamik apabila diakses. Tingkah laku ini berbeza daripada fungsi biasa, yang dirujuk oleh objek yang sama tanpa mengira bila ia dipanggil.

Untuk memahami perkara ini, pertimbangkan contoh berikut:

class What:
    def meth(self):
        pass
What().meth is What().meth  # False

Dalam kod ini , kaedah meth tidak sama walaupun merujuk kepada fungsi asas yang sama. Ini kerana setiap objek meth ialah contoh unik yang dicipta pada masa jalan.

Sebab bagi tingkah laku ini terletak pada proses carian atribut Python, di mana objek kaedah dijana dengan memanggil kaedah (fungsi) deskriptor .__get__:

What.__dict__['meth'].__get__(What(), What)

Penciptaan objek kaedah yang dinamik ini membawa kepada pemerhatian berikut:

  • Instance kelas yang sama mempunyai objek meth yang berbeza:

    inst = What()
    inst.meth is inst.meth  # False
  • Kaedah dalam 不同的 kelas sentiasa objek berbeza:

    What.meth is Other.meth  # False

Sebelum Python 3.8, menguji kesamaan kaedah menggunakan == boleh menghasilkan hasil yang tidak konsisten. Walau bagaimanapun, Python 3.8 dan kemudiannya membenarkan perbandingan kesamaan kaedah berdasarkan atribut .___self__ dan .___func__ mereka, jika ia sepadan secara identik.

Sebagai amalan terbaik, untuk menentukan sama ada dua kaedah mewakili fungsi asas yang sama, bandingkan atribut .__func__ mereka:

What.meth.__func__ == What.meth.__func__  # True
What().meth.__func__ == What().meth.__func__  # True (for same instance)
What().meth.__func__ == What(other_instance).meth.__func__  # False (for different instances)

Atas ialah kandungan terperinci Mengapa Kaedah Python Tidak Sama, Walaupun Ia Merujuk kepada Fungsi Asas yang Sama?. 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