Rumah >pembangunan bahagian belakang >Tutorial Python >Mengapa Kaedah Python Berkelakuan Berbeza dalam Kesamaan Rujukan Berbanding dengan Fungsi?

Mengapa Kaedah Python Berkelakuan Berbeza dalam Kesamaan Rujukan Berbanding dengan Fungsi?

Linda Hamilton
Linda Hamiltonasal
2024-10-30 07:32:02510semak imbas

 Why Do Python Methods Behave Differently in Reference Equality Compared to Functions?

Menyingkap Enigma: Kesamaan Rujukan Kaedah dalam Python

Dalam bidang pengaturcaraan Python, konsep kesamaan rujukan boleh memikat dan membingungkan. Yang menghairankan, kaedah, tidak seperti fungsi biasa, mempamerkan gelagat yang unik apabila merujuk kepada kesamaan rujukan.

Mengapa perbezaan yang ketara ini? Jawapannya terletak pada sifat bagaimana kaedah dicipta dan digunakan. Tidak seperti fungsi, yang wujud secara bebas dalam skop global, kaedah dijana secara dinamik setiap kali ia diakses. Ini berpunca daripada peranan fungsi sebagai deskriptor dalam Python. Apabila kaedah .__get__ fungsi dipanggil, objek kaedah dikembalikan.

Pertimbangkan contoh berikut:

<code class="python">class What:
    def meth(self):
        pass

print(What.meth is What.meth)  # This is False in Python 2
print(inst.meth is inst.meth)  # False</code>

Kod di atas akan mencetak Palsu untuk kedua-dua senario. Ini kerana setiap akses kepada What.meth menghasilkan objek kaedah baharu dicipta. Oleh itu, objek kaedah ini tidak boleh dianggap sama rujukan.

Sebaliknya, fungsi biasa ialah entiti global, jadi apabila func dipanggil, ia sentiasa merujuk kepada objek yang sama. Ini menerangkan hasil True dalam func ialah func.

Walau bagaimanapun, Python 3.8 memperkenalkan peningkatan yang ketara. Kini, dua kaedah dianggap sama jika atribut .__self__ dan .__func__ mereka ialah objek yang sama. Ini bermakna bahawa jika dua kaedah membalut fungsi yang sama dan terikat kepada contoh yang sama, mereka akan membandingkan True menggunakan ==.

Untuk versi Python sebelum 3.8, kaedah == tingkah laku adalah tidak konsisten. Kaedah Python dan satu jenis kaedah C membandingkan diri untuk kesamaan, manakala satu lagi kaedah C membandingkan diri mengikut identiti.

Untuk menguji sama ada dua kaedah mewakili yang sama fungsi asas, adalah disyorkan untuk membandingkan atribut func mereka:

<code class="python">print(What.meth == What.meth)     # functions (or unbound methods in Python 2)
print(What().meth == What().meth) # bound methods with *different* instances
print(What().meth.__func__ == What().meth.__func__) # functions</code>

Atas ialah kandungan terperinci Mengapa Kaedah Python Berkelakuan Berbeza dalam Kesamaan Rujukan Berbanding dengan Fungsi?. 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