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

Linda Hamilton
Lepaskan: 2024-10-30 07:32:02
asal
440 orang telah melayarinya

 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>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

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!