Apa perbedaan method dan function di python?

Penjelasan yang akurat dari Armin Ronacher di atas, memperluas jawabannya sehingga pemula seperti saya memahaminya dengan baik:

Perbedaan dalam metode yang didefinisikan dalam suatu kelas, apakah metode statis atau contoh (masih ada jenis lain - metode kelas - tidak dibahas di sini sehingga melewatkannya), terletak pada fakta apakah mereka entah bagaimana terikat pada instance kelas atau tidak. Sebagai contoh, katakan apakah metode menerima referensi ke instance kelas selama runtime

class C:
    a = [] 
    def foo(self):
        pass

C # this is the class object
C.a # is a list object (class property object)
C.foo # is a function object (class property object)
c = C() 
c # this is the class instance

The __dict__properti kamus dari objek kelas memegang referensi untuk semua properti dan metode dari objek kelas dan dengan demikian

>>> C.__dict__['foo']
<function foo at 0x17d05b0>

metode foo dapat diakses seperti di atas. Poin penting yang perlu diperhatikan di sini adalah bahwa segala sesuatu di python adalah objek dan referensi dalam kamus di atas sendiri menunjuk ke objek lain. Izinkan saya menyebutnya Objek Properti Kelas - atau sebagai CPO dalam lingkup jawaban saya untuk singkatnya.

Jika CPO adalah descriptor, maka python interpretor memanggil __get__()metode CPO untuk mengakses nilai yang dikandungnya.

Untuk menentukan apakah CPO adalah deskriptor, penafsir python memeriksa jika mengimplementasikan protokol deskriptor. Untuk mengimplementasikan protokol deskriptor adalah dengan mengimplementasikan 3 metode

def __get__(self, instance, owner)
def __set__(self, instance, value)
def __delete__(self, instance)

untuk mis

>>> C.__dict__['foo'].__get__(c, C)

dimana

  • self adalah CPO (bisa berupa instance dari daftar, str, fungsi dll) dan disediakan oleh runtime
  • instance adalah turunan dari kelas di mana CPO ini didefinisikan (objek 'c' di atas) dan perlu kejelasan yang disediakan oleh kami
  • owneradalah kelas di mana CPO ini didefinisikan (objek kelas 'C' di atas) dan perlu disediakan oleh kami. Namun ini karena kami menyebutnya di CPO. ketika kita menyebutnya sebagai instance, kita tidak perlu menyediakan ini karena runtime dapat menyediakan instance atau kelasnya (polimorfisme)
  • value adalah nilai yang dimaksudkan untuk CPO dan perlu dipasok oleh kami

Tidak semua CPO adalah deskriptor. Sebagai contoh

>>> C.__dict__['foo'].__get__(None, C)
<function C.foo at 0x10a72f510> 
>>> C.__dict__['a'].__get__(None, C)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'list' object has no attribute '__get__'

Ini karena kelas daftar tidak mengimplementasikan protokol deskriptor.

Jadi argumen sendiri c.foo(self)diperlukan karena tanda tangan metodenya sebenarnya ini C.__dict__['foo'].__get__(c, C)(seperti yang dijelaskan di atas, C tidak diperlukan karena dapat ditemukan atau polymorphed) Dan ini juga mengapa Anda mendapatkan TypeError jika Anda tidak memberikan argumen contoh yang diperlukan.

Jika Anda perhatikan metode ini masih direferensikan melalui kelas Object C dan pengikatan dengan instance kelas dicapai melalui melewati konteks dalam bentuk objek instance ke dalam fungsi ini.

Ini cukup luar biasa karena jika Anda memilih untuk tidak menyimpan konteks atau tidak mengikat pada instance, yang diperlukan hanyalah menulis kelas untuk membungkus deskriptor CPO dan mengganti __get__()metodenya sehingga tidak memerlukan konteks. Kelas baru ini adalah apa yang kita sebut dekorator dan diterapkan melalui kata kunci@staticmethod

class C(object):
  @staticmethod
  def foo():
   pass

Tidak adanya konteks dalam CPO yang dibungkus baru footidak menimbulkan kesalahan dan dapat diverifikasi sebagai berikut:

>>> C.__dict__['foo'].__get__(None, C)
<function foo at 0x17d0c30>

Use case dari metode statis lebih merupakan penamaan namespace dan kode rawat (mengeluarkannya dari kelas dan membuatnya tersedia di seluruh modul dll).

Mungkin lebih baik untuk menulis metode statis daripada metode contoh bila memungkinkan, kecuali tentu saja Anda perlu membuat kontekstual metode (seperti variabel akses contoh, variabel kelas dll). Salah satu alasannya adalah untuk memudahkan pengumpulan sampah dengan tidak menyimpan referensi yang tidak diinginkan ke objek.

Apa beda method dan Function?

Secara singkat perbedaan antara fungsi dan metode adalah fungsi adalah serangkaian instruksi untuk menjalankan sebuah tugas, sedangkan metode adalah serangkaian instruksi yang berkaitan dengan sebuah object.

Apa itu fungsi pada python?

Fungsi (Function) adalah suatu program terpisah dalam blok sendiri yang berfungsi sebagai sub-program (modul program) yang merupakan sebuah program kecil untuk memproses sebagian dari pekerjaan program utama. modul tertentu saja tanpa menggangu keseluruhan program.

Apa fungsi dari method?

Sebuah method dapat mengembalikan nilai tertentu (memiliki return value), bisa juga tidak (void). Method dapat menerima argumen sebagai nilai masukan yang akan diproses di dalam method bersangkutan. Method dapat kita gunakan (panggil) berulang-ulang dari mana saja dalam program kita.

Apa perbedaan antara class dan juga Function?

Class dalam PHP sebenarnya hampir sama seperti Function. Tapi ada beberapa perbedaan yang perlu kita ketahui, diantaranya adalah : Class dapat menyimpan Function Class memiliki karakteristik yang terkadang bisa menyimpan data (variabel) dan Function. Function 1.Memudahkan dalam mengembangkan program.