Rumah > pembangunan bahagian belakang > Tutorial Python > Apakah Perbezaan Antara Fungsi, Kaedah Tidak Terikat dan Kaedah Terikat dalam Python?

Apakah Perbezaan Antara Fungsi, Kaedah Tidak Terikat dan Kaedah Terikat dalam Python?

Susan Sarandon
Lepaskan: 2024-10-26 07:03:30
asal
361 orang telah melayarinya

  What's the Difference Between Functions, Unbound Methods, and Bound Methods in Python?

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

Pembolehubah f1 boleh nyata dalam tiga bentuk yang berbeza:

  • Kaedah Terikat: a.f1 menyediakan akses kepada kaedah yang dikaitkan dengan contoh a.
  • Kaedah Tidak Terikat: A.f1 sepadan dengan kaedah yang dilampirkan pada kelas A.
  • Fungsi: a.__dict__['f1'] mendapatkan semula definisi fungsi asas secara langsung .

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

Di sini, f1 ialah fungsi. Sebaliknya, C.f1 ialah kaedah tidak terikat:

<code class="python">class C(object):
    f1 = f1</code>
Salin selepas log masuk

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

atau menggunakan protokol deskriptor:

<code class="python">C.f1.__get__(C(), C)</code>
Salin selepas log masuk

Fungsi boleh diubah menjadi kaedah tidak terikat secara manual:

<code class="python">import types
types.MethodType(f1, None, C)</code>
Salin selepas log masuk

Menggabungkan teknik ini membolehkan penciptaan langsung kaedah terikat:

<code class="python">types.MethodType(f1, None, C).__get__(C(), C)</code>
Salin selepas log masuk

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

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

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

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!

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