Metode kelas vs metode instance vs metode statis python

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 lagi

Kami 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 kelas

Berdasarkan 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)
@staticmethod
def get_years_from_release(release_year):
    return datetime.datetime.now().year - int(release_year)

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.
_0

Coba 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.
_1

Mari 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.
_2

Perhatikan 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.
_3

Kode 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.
_4

Pindahkan 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.
_5

Dan 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.
_6

Bekerja 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.
_7

Kami 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.
_8

Kemudian 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.
_9

Kami melakukannya

Ini berarti bahwa…

Metode statis diwarisi oleh subkelas di Python

Bisakah 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)
0

Kemudian 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.
_8

Dan panggil metode kelas menggunakan subkelas ini

def get_years_from_release(self):
    return datetime.datetime.now().year - int(self.release_year)
2

Seperti 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 Python

Kesimpulan

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

Apa saja 3 jenis metode dalam Python?

Pada dasarnya ada tiga jenis metode dalam Python. .
Metode Instance
Metode Kelas
Metode Statis

Apa perbedaan antara metode instance dan metode statis?

Metode Instance adalah metode yang membutuhkan objek dari kelasnya untuk dibuat sebelum dapat dipanggil. Metode statis adalah metode di Java yang dapat dipanggil tanpa membuat objek kelas. Metode statis dideklarasikan dengan kata kunci statis. Metode instan tidak dengan kata kunci statis

Apa perbedaan antara CLS dan self Python?

diri sendiri vs cls . Jika metode yang dibuat adalah metode instance maka kata yang dicadangkan self harus digunakan, tetapi jika metode tersebut adalah metode kelas maka kata kunci cls harus digunakan.

Apakah metode statis lebih cepat Python?

1 Jawaban. Simpan jawaban ini. Tampilkan aktivitas di postingan ini. Tampaknya metode statis sedikit lebih cepat (kemungkinan hanya karena tidak perlu meneruskan argumen ke fungsi sama sekali), tetapi kita berbicara tentang .