Apakah Anda mencoba memahami konsep metode statis dan metode kelas dengan Python?
Metode statis tidak dapat mengakses atribut kelas atau atribut instance. Ini setara dengan fungsi normal tetapi merupakan bagian dari kelas karena memiliki kesamaan konteks logis yang sama. Metode kelas tidak dapat mengakses atribut instance dan sering digunakan sebagai metode pabrik
Dalam tutorial ini akan menjadi jelas bagi Anda bagaimana Anda dapat menggunakan metode statis dan kelas dibandingkan dengan metode instance standar
Mari kita koding
Daftar isi
Apa itu Metode Statis di Python?
Metode statis adalah metode yang dapat Anda panggil tanpa membuat instance kelas. Ini seperti fungsi standar di dalam kelas. Metode statis bertindak sebagai metode utilitas untuk kelas
Untuk memahami bagaimana tampilan metode statis, mari kita mulai dari kelas Python yang merepresentasikan film
Kelas ini memiliki konstruktor dan metode instance dasar yang mencetak deskripsi singkat tentang sebuah film
class Movie: def __init__(self, name, release_year): self.name = name self.release_year = release_year def get_description(self): print(f"The value of self is {self}.") print(f"The movie {self.name} was released in {self.release_year}.")Ketika Anda mendefinisikan metode instance di kelas, metode itu menerima self sebagai argumen pertama di mana self adalah instance dari kelas tempat metode itu dipanggil
Perhatikan bahwa dalam metode contoh kami juga mencetak nilai diri sehingga saya dapat menunjukkan kepada Anda apa yang ada di dalamnya
Sekarang buat instance dari kelas ini dan panggil metodenya
get_description() pada contoh itu. movie = Movie("Rambo", "1982") movie.get_description() [output] The value of self is <__main__.Movie object at 0x104f08490>. The movie Rambo was released in 1982._Dari output Anda dapat melihat bahwa self adalah objek Movie, atau dengan kata lain, turunan dari kelas Movie
Dan sekarang buat metode instance lain yang disebut get_years_from_release() yang akan memberi tahu kita jumlah tahun yang telah berlalu sejak tanggal rilis sebuah film
def get_years_from_release(self): return datetime.datetime.now().year - int(self.release_year)Catatan. ingat untuk mengimpor modul datetime jika tidak, Anda akan melihat pengecualian "nama tidak ditentukan".
Mari gunakan metode ini untuk mencetak pesan yang memberitahukan berapa umur film kita…
movie = Movie("Rambo", "1982") print(f"The movie {movie.name} is {movie.get_years_from_release()} years old.") [output] The movie Rambo is 40 years old.Itu keren
Sekarang, mari kita lakukan percobaan kecil…
Kami akan menambahkan dekorator @staticmethod ke metode ini dan mencoba menjalankannya lagiKami mendapatkan kembali kesalahan berikut
Traceback (most recent call last): File "static_class_methods.py", line 17, in <module> print(f"The movie {movie.name} is {movie.get_years_from_release()} years old.") TypeError: get_years_from_release() missing 1 required positional argument: 'self'_Penyebab kesalahan ini adalah metode instance, ketika dipanggil, secara implisit melewatkan instance sebagai parameter mandiri
Tapi hal yang sama tidak terjadi saat Anda mendekorasi metode dengan @staticmethod
Itu karena…
Metode statis tidak spesifik untuk instance kelas dan itulah mengapa parameter self tidak berlaku untuknya
Metode statis tidak menerima diri sebagai argumen pertama, itu berperilaku seperti fungsi sederhana dengan satu-satunya perbedaan bahwa itu adalah bagian dari kelasBerdasarkan ini kami akan
- Hapus argumen self dari metode statis
- Melewati tahun rilis film sebagai argumen untuk metode statis mengingat kita tidak bisa merujuk pada diri sendiri. rilis_tahun dalam metode (metode statis tidak memiliki akses ke diri sendiri)
Kali ini output dari metode ini benar
movie = Movie("Rambo", "1982") print(f"The movie {movie.name} is {movie.get_years_from_release(movie.release_year)} years old.") [output] The movie Rambo is 40 years old._Catatan. di sini kami harus melewati film. release_year ke metode statis sementara sebelumnya, dalam metode instance, tahun rilis secara otomatis dibaca dari instance menggunakan self. tahun rilis
Dan di bawah ini Anda dapat melihat bahwa kita juga dapat memanggil metode statis menggunakan kelas, bukan instance
Keluaran tidak berubah
print(f"The movie {movie.name} is {Movie.get_years_from_release(movie.release_year)} years old.") [output] The movie Rambo is 40 years old.Alasan mengapa Anda mendefinisikan metode statis di kelas adalah karena metode tersebut secara logis terkait dengan kelas itu sendiri
Begini cara kode kita sejauh ini
import datetime class Movie: def __init__(self, name, release_year): self.name = name self.release_year = release_year def get_description(self): print(f"The value of self is {self}.") print(f"The movie {self.name} was released in {self.release_year}.") @staticmethod def get_years_from_release(release_year): return datetime.datetime.now().year - int(release_year)_Dapatkah Metode Statis Mengakses Atribut Instance?
Ini adalah sesuatu yang telah kita lihat di bagian sebelumnya…
Tapi pengulangan bagus untuk memastikan konsep ini jelas
Metode statis di Python tidak dapat mengakses atribut instance karena, berbeda dengan metode instance, metode tersebut tidak menerima self sebagai argumen
Pada bagian selanjutnya saya akan menunjukkan kepada Anda jenis metode lain yang dapat Anda buat di kelas Python Anda, metode yang berbeda dari metode instan atau metode statis
Apa itu Metode Kelas di Python?
Jenis metode lain yang bisa Anda buat di kelas Python adalah metode kelas
Biarkan saya memberi tahu Anda lebih banyak tentang itu …
Metode kelas adalah metode yang secara implisit menerima kelas sebagai argumen pertama. Metode kelas umumnya digunakan sebagai metode pabrik. Dengan kata lain mereka digunakan untuk membuat instance kelas yang mirip dengan apa yang dilakukan oleh konstruktor kelas
Metode kelas menerima cls (kelas) sebagai argumen pertama seperti halnya metode instan menerima diri (instance kelas) sebagai argumen pertama
Berikut adalah tampilan metode kelas
class MyClass: @classmethod def my_class_method(cls, arg1, arg2, ..., argN): <method_body>_Mari kita coba membuat metode kelas yang mirip dengan apa yang telah kita lakukan di bagian sebelumnya dengan metode statis
Tetapi sebelum melakukan itu, kita akan menambahkan atribut instance lain ke kelas kita. genre filmnya
Ini adalah kode yang diperbarui ...
movie = Movie("Rambo", "1982") movie.get_description() [output] The value of self is <__main__.Movie object at 0x104f08490>. The movie Rambo was released in 1982._0Coba buat instance dan panggil kedua metode untuk memastikan kode ini berfungsi
movie = Movie("Rambo", "1982") movie.get_description() [output] The value of self is <__main__.Movie object at 0x104f08490>. The movie Rambo was released in 1982._1Mari tambahkan metode kelas yang bisa kita gunakan untuk membuat film aksi…
movie = Movie("Rambo", "1982") movie.get_description() [output] The value of self is <__main__.Movie object at 0x104f08490>. The movie Rambo was released in 1982._2Perhatikan bahwa metode yang telah kita buat menggunakan dekorator @classmethod
Kami juga mencetak nilai cls untuk membandingkannya dengan nilai diri dalam keluaran kami
Panggil metode kelas menggunakan nama kelas Film
movie = Movie("Rambo", "1982") movie.get_description() [output] The value of self is <__main__.Movie object at 0x104f08490>. The movie Rambo was released in 1982._3Kode berfungsi dengan baik
Seperti yang Anda lihat, kami dapat membuat instance film menggunakan metode kelas baru alih-alih konstruktor
Juga, dapatkah Anda melihat perbedaan antara nilai cls dan self?
Argumen cls adalah kelas yang memanggil metode kelas. Diri Argumen adalah turunan dari kelas itu (atau objek). Menggunakan cls dan self adalah konvensi penamaan standar di seluruh pengembang Python tetapi itu bukan sesuatu yang dipaksakan oleh juru bahasa Python. Anda dapat memanggil mereka secara berbeda tetapi ini akan membuat kode Anda lebih sulit dibaca oleh pengembang lain
Kapan Menggunakan Metode Statis vs Fungsi di Python
Anda mungkin bertanya-tanya…
Mengapa Anda mendefinisikan metode statis di kelas padahal sebenarnya itu bisa menjadi fungsi dasar Python?
Lagipula itu tidak menerima argumen khusus kelas atau instance apa pun seperti cls atau self
Bisakah kita mengganti metode statis dengan fungsi?
Suatu fungsi dapat menggantikan metode statis, dan ada beberapa skenario yang lebih masuk akal untuk menggunakan suatu fungsi. Misalnya, jika metode statis sangat umum sehingga dapat relevan dengan konteks beberapa kelas. Dalam hal ini bisa menjadi fungsi terpisah yang dipanggil oleh masing-masing kelas saat dibutuhkan
Juga…
Anda akan mendefinisikan metode statis di kelas alih-alih menggunakan fungsi jika metode itu sangat spesifik untuk apa yang dilakukan kelas Anda sehingga lebih masuk akal untuk menyimpannya di kelas
Sebagai contoh…
Mari ambil kode terbaru kita dan ubah info metode statis menjadi fungsi untuk melihat cara kerjanya
movie = Movie("Rambo", "1982") movie.get_description() [output] The value of self is <__main__.Movie object at 0x104f08490>. The movie Rambo was released in 1982._4Pindahkan metode statis di luar kelas dan hapus dekorator @staticmethod
Kode menjadi…
movie = Movie("Rambo", "1982") movie.get_description() [output] The value of self is <__main__.Movie object at 0x104f08490>. The movie Rambo was released in 1982._5Dan terakhir mari kita panggil fungsi ini setelah membuat instance dari kelas Movie
movie = Movie("Rambo", "1982") movie.get_description() [output] The value of self is <__main__.Movie object at 0x104f08490>. The movie Rambo was released in 1982._6Bekerja dengan baik
Bisakah Metode Statis Diwarisi dengan Python?
Saya ingin tahu apakah kita dapat mewarisi metode statis di dalam kelas anak
Mari kita verifikasi…
Mulai dari versi sederhana dari kelas kami sebelumnya
movie = Movie("Rambo", "1982") movie.get_description() [output] The value of self is <__main__.Movie object at 0x104f08490>. The movie Rambo was released in 1982._7Kami ingin memverifikasi apakah metode statis dapat diwariskan
Jadi mari kita tentukan kelas baru
tanpa implementasi disebut FantasyMovie yang mewarisi kelas Movie. movie = Movie("Rambo", "1982") movie.get_description() [output] The value of self is <__main__.Movie object at 0x104f08490>. The movie Rambo was released in 1982._8Kemudian buat instance dari kelas ini
Mari kita lihat apakah kita dapat memanggil metode statis dari kelas induk get_years_from_release() dan jika kita mendapatkan kembali hasil yang benar
movie = Movie("Rambo", "1982") movie.get_description() [output] The value of self is <__main__.Movie object at 0x104f08490>. The movie Rambo was released in 1982._9Kami melakukannya
Ini berarti bahwa…
Metode statis diwarisi oleh subkelas di PythonBisakah Metode Kelas Diwarisi dengan Python?
Mari kita lakukan pengujian serupa dengan yang telah kita lakukan di bagian sebelumnya, tetapi kali ini dengan metode kelas
Mulailah dengan kelas yang hanya memiliki konstruktor dan metode kelas
def get_years_from_release(self): return datetime.datetime.now().year - int(self.release_year)0Kemudian gunakan kelas anak yang sama yang telah kita buat sebelumnya…
movie = Movie("Rambo", "1982") movie.get_description() [output] The value of self is <__main__.Movie object at 0x104f08490>. The movie Rambo was released in 1982._8Dan panggil metode kelas menggunakan subkelas ini
def get_years_from_release(self): return datetime.datetime.now().year - int(self.release_year)2Seperti yang Anda lihat, kami telah berhasil membuat instance meskipun saat ini kami sedang menggabungkan dua genre film. Fantasi dan Aksi
Bagaimanapun, ini hanyalah sebuah contoh untuk menunjukkan kepada Anda bahwa Anda dapat memanggil metode kelas dari kelas anak
Metode kelas diwarisi oleh subkelas dengan PythonKesimpulan
Mari rekap bagaimana metode instance, metode kelas, dan metode statis berbeda satu sama lain berdasarkan argumen pertama mereka
- Metode instan. menerima instance sebagai argumen pertama (self)
- Metode kelas. menerima kelas sebagai argumen pertama (cls)
- Metode statis. tidak menerima argumen khusus
Dan sekarang saatnya bagi Anda untuk mulai menggunakan metode ini dalam kode Anda. 🙂
Terus menulis kode dan terus belajar
Pos terkait
Kesalahan Kunci Python. Bagaimana Anda Bisa Memperbaikinya dengan Cepat?
File Gitigore Untuk Proyek Python Anda. Seperti apa kelihatannya?
Temukan Nilai Minimum dan Maksimum dalam Kamus Python [Langkah demi Langkah]
Claudio Sabato
Saya Pimpinan Teknologi, Insinyur Perangkat Lunak, dan Pelatih Pemrograman. Saya ingin membantu Anda dalam perjalanan Anda untuk menjadi Pengembang Super