Menyingkap Perbezaan Antara Fungsi, Kaedah Tidak Terikat dan Kaedah Terikat
Pertimbangkan coretan kod berikut:
<code class="python">class A(object): def f1(self): pass a = A()</code>
Pembolehubah f1 boleh nyata dalam tiga bentuk yang berbeza:
Perbezaan Objek
Sesuatu fungsi, yang ditakrifkan oleh kata kunci def atau lambda, mengalami perubahan apabila diletakkan dalam pernyataan kelas. Dalam Python 2, transformasi ini mencipta kaedah tidak terikat, konsep yang tiada dalam Python 3. Mengakses kaedah ini pada tika kelas seterusnya mengubahnya menjadi kaedah terikat, yang mengikat tika itu dengan lancar sebagai parameter awal (diri).
Contoh:
<code class="python">def f1(self): pass</code>
Di sini, f1 ialah fungsi. Sebaliknya, C.f1 ialah kaedah tidak terikat:
<code class="python">class C(object): f1 = f1</code>
Kaedah Invokasi dan Transformasi
Kaedah tidak terikat boleh ditukar kepada kaedah terikat dengan mengaksesnya pada contoh jenis kelas mereka:
<code class="python">C().f1</code>
atau menggunakan protokol deskriptor:
<code class="python">C.f1.__get__(C(), C)</code>
Fungsi boleh diubah menjadi kaedah tidak terikat secara manual:
<code class="python">import types types.MethodType(f1, None, C)</code>
Menggabungkan teknik ini membolehkan penciptaan langsung kaedah terikat:
<code class="python">types.MethodType(f1, None, C).__get__(C(), C)</code>
Perbezaan penting antara fungsi dan kaedah tidak terikat terletak pada kesedaran kedua tentang mengikat kelasnya. Oleh itu, menggunakan atau mengikat kaedah tidak terikat memerlukan contoh jenis kelas gabungannya.
Dalam Python 3, perbezaan antara fungsi dan kaedah tidak terikat dihapuskan. Sebaliknya, mengakses fungsi pada contoh kelas secara langsung mengembalikan fungsi itu sendiri:
<code class="python">C.f1 is f1</code>
Kesetaraan Kaedah
Ringkasnya, seruan berikut adalah setara dalam kedua-dua Python 2 dan Python 3:
<code class="python">f1(C()) C.f1(C()) C().f1()</code>
Mengikat fungsi pada contoh secara berkesan membetulkan parameter awalnya kepada contoh, menjadikan kaedah terikat serupa dengan ungkapan lambda berikut:
<code class="python">lambda *args, **kwargs: f1(C(), *args, **kwargs)</code>
Atas ialah kandungan terperinci Apakah Perbezaan Antara Fungsi, Kaedah Tidak Terikat dan Kaedah Terikat dalam Python?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!