Telah ada diskusi dalam obrolan yang berkaitan dengan pertanyaan (pertanyaan itu sendiri tidak relevan dengan yang satu ini), yang telah mengungkapkan saya mungkin tidak tahu Python sama sekali.
Dalam benak saya, meskipun terminologi berbeda antar bahasa, kami umumnya dapat mengkategorikan fungsi sebagai:
- fungsi [gratis]
- metode statis / fungsi anggota statis
- metode non-statis / fungsi anggota tidak statis
Rupanya dalam Python ada jenis fungsi lain yang tidak masuk ke dalam kategori di atas, yang merupakan metode tetapi "tidak tahu kelasnya".
Apa itu "metode kelas" dan "metode instan", dalam Python?
python
terminology
Lightness Races with Monica
sumber
sumber
Jawaban:
Jawaban singkatnya
Jawaban panjangnya
Metode kelas
Sebuah metode kelas adalah salah satu yang termasuk kelas secara keseluruhan. Itu tidak membutuhkan contoh. Sebagai gantinya, kelas akan secara otomatis dikirim sebagai argumen pertama. Metode kelas dideklarasikan dengan
@classmethod
dekorator.Sebagai contoh:
Metode Instance
Di sisi lain, metode instance memerlukan instance untuk menyebutnya, dan tidak memerlukan dekorator. Sejauh ini ini adalah jenis metode yang paling umum.
(catatan: di atas adalah dengan python3; dengan python2 Anda akan mendapatkan kesalahan yang sedikit berbeda)
Metode statis
Sebuah metode statis mirip dengan metode kelas, tetapi tidak akan mendapatkan objek kelas sebagai parameter otomatis. Itu dibuat dengan menggunakan
@staticmethod
dekorator.Tautan dokumentasi
Berikut ini tautan ke dokumen python3 yang relevan:
The Dokumentasi model data telah mengatakan tentang perbedaan antara metode kelas dan metode statis:
Pertanyaan-pertanyaan Terkait
sumber
"^ def("
, lalu menghitung semua contoh@staticmethod
. Sangat tidak ilmiah, tetapi mungkin berada di stadion baseball."Metode instance" menggunakan informasi yang terdapat dalam instance untuk mengetahui nilai apa yang akan dikembalikan (atau efek samping mana yang harus dilakukan). Ini sangat umum.
"Metode kelas" menggunakan informasi tentang kelas (dan bukan turunan dari kelas itu) untuk memengaruhi apa yang dilakukannya (mereka biasanya digunakan untuk membuat instance baru sebagai konstruktor alternatif, dan karenanya tidak terlalu umum).
"Metode statis" tidak menggunakan informasi apa pun tentang kelas atau instance untuk menghitung apa yang dilakukannya. Biasanya hanya di kelas untuk kenyamanan. (Karena itu, ini juga tidak umum.)
Fungsi X
Ingat kelas matematika, "kamu adalah fungsi dari x
f(x)
,?" Mari kita terapkan itu dalam kode:Tersirat di atas adalah bahwa karena
x
dapat berubah,y
dapat berubah ketikax
perubahan. Inilah yang dimaksud ketika kita mengatakan bahwa "y
adalah fungsi darix
"Apa yang akan
y
terjadi bilaz
adalah1
?2
?'FooBarBaz'
?y
bukan fungsiz
, jadiz
bisa apa saja dan tidak memengaruhi hasil fungsi dengan anggapan kitafunction
adalah fungsi murni. (Jika diaksesz
sebagai variabel global, maka itu bukan fungsi murni - inilah yang dimaksud dengan kemurnian fungsional.)Ingatlah hal-hal di atas ketika Anda membaca deskripsi berikut:
Metode Instance
Metode instance adalah fungsi yang merupakan fungsi dari instance . Fungsi menerima instance secara implisit sebagai argumen padanya, dan instance digunakan oleh fungsi untuk menentukan output dari fungsi.
Contoh bawaan dari metode instance adalah str.lower:
str.lower
dipanggil pada instance string, dan menggunakan informasi yang terkandung dalam instance untuk mencari string baru yang akan dikembalikan.Metode Kelas:
Ingat, dengan Python, semuanya adalah objek. Itu berarti kelas adalah objek, dan dapat dilewatkan sebagai argumen ke suatu fungsi.
Metode kelas adalah fungsi yang merupakan fungsi dari kelas . Itu menerima kelas sebagai argumen untuk itu.
Contoh bawaan adalah
dict.fromkeys
:Fungsi tersebut secara implisit mengetahui kelasnya sendiri, fungsinya menggunakan kelas tersebut untuk memengaruhi output fungsi, dan ia membuat yang baru dari kelas tersebut dari yang dapat diubah. Sebuah OrderedDict menunjukkan ini saat menggunakan metode yang sama:
Metode kelas menggunakan informasi tentang kelas (dan bukan turunan dari kelas itu) untuk memengaruhi tipe kelas yang akan dikembalikan.
Metode Statis
Anda menyebutkan metode yang "tidak tahu kelasnya" - ini adalah metode statis dengan Python. Itu hanya dilampirkan untuk kenyamanan ke objek kelas. Secara opsional bisa menjadi fungsi terpisah di modul lain, tetapi tanda tangan panggilannya akan sama.
Metode statis adalah fungsi baik dari kelas maupun objek.
Contoh built-in dari metode statis adalah str.maketrans dari Python 3.
Diberikan beberapa argumen, itu membuat kamus yang bukan fungsi dari kelasnya.
Ini nyaman karena
str
selalu tersedia di namespace global, sehingga Anda dapat dengan mudah menggunakannya dengan fungsi terjemahan:Dalam Python 2, Anda harus mengaksesnya dari
string
modul:Contoh
Mari instantiate:
Sekarang instance dapat memanggil semua metode:
Tetapi kelas biasanya tidak dimaksudkan untuk memanggil metode instance, meskipun diharapkan memanggil yang lain:
Anda harus secara eksplisit memberikan instance untuk memanggil metode instance:
sumber
MyClass(1,2,3)
tapi bukan suka,MyClass.get_special(1,2,3)
), dan metode statis hanya sebagai menjadi fungsi normal yang bisa berdiri sendiri."Metode instance" adalah metode yang dapat melewati objek instance sebagai parameter pertama, yang oleh konvensi disebut
self
. Ini standarnya."Metode statis" adalah metode tanpa
self
parameter awal . Ini diimplementasikan dengan dekorator @staticmethod ."Metode kelas" adalah metode di mana parameter awal bukan objek instan, tetapi objek kelas ( lihat bagian dokumen Python ini untuk apa "objek kelas"), yang oleh konvensi disebut
cls
. Ini diimplementasikan dengan dekorator @classmethod .Penggunaan khas dari istilah "metode statis" dalam C / C ++ / etc berlaku untuk metode "kelas" Python "statis" dan Python, karena kedua jenis metode tersebut tidak memiliki referensi ke instance. Dalam C / C ++ / etc, metode biasanya memiliki akses implisit ke semua anggota / metode non-instance kelas, yang mungkin mengapa perbedaan ini hanya ada dalam bahasa seperti Python / Ruby / etc.
sumber
Class::staticMethod()
dan hanya itu (selama Anda tidak dilarang menyebutnya karenastaticMethod()
bersifat pribadi atau semacamnya).