Rumah  >  Artikel  >  pembangunan bahagian belakang  >  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
Susan Sarandonasal
2024-10-26 07:03:30273semak imbas

  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>

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>

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!

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