Rumah > Artikel > pembangunan bahagian belakang > Mengapa Kaedah Python Tidak Sama, Walaupun Ia Merujuk kepada Fungsi Asas yang Sama?
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!