Dekorator Python: Menambahkan Superpowers ke Fungsi Anda
Halo para pemrogram Python yang aspiratif! Hari ini, kita akan memasuki dunia yang menarik dari dekorator Python. Pernahkah Anda membayangkan dekorator sebagai wadah magis yang dapat meningkatkan fungsi Anda dengan superpowers? Menarik, kan? Mari kita melakukan perjalanan ini bersama-sama!
Apa Itu Dekorator?
Bayangkan Anda memiliki hadiah yang cantik yang dikemas. Kertas kemeja tidak mengubah hadiah di dalamnya, tapi membuatnya terlihat lebih cantik, kan? Itulah yang akan dekorator lakukan ke fungsi Anda di Python. Mereka membungkus fungsi Anda, menambahkan fungsi ekstra tanpa mengubah fungsi aslinya.
Mari kita mulai dengan contoh sederhana:
def my_decorator(func):
def wrapper():
print("Ada yang terjadi sebelum fungsi dipanggil.")
func()
print("Ada yang terjadi setelah fungsi dipanggil.")
return wrapper
@my_decorator
def say_hello():
print("Hello!")
say_hello()
Jika Anda menjalankan kode ini, Anda akan melihat:
Ada yang terjadi sebelum fungsi dipanggil.
Hello!
Ada yang terjadi setelah fungsi dipanggil.
Mari kita pecahkan ini:
- Kita definisikan fungsi dekorator
my_decorator
yang mengambil fungsi sebagai argumen. - Di dalam
my_decorator
, kita definisikan fungsiwrapper
yang menambahkan beberapa perilaku sebelum dan setelah memanggil fungsi asli. - Kita menggunakan sintaks
@my_decorator
untuk menerapkan dekorator kita ke fungsisay_hello
. - Ketika kita memanggil
say_hello()
, itu sebenarnya memanggil versi yang dibungkus dari fungsi.
Gak keren? Kita baru saja menambahkan beberapa perilaku ekstra ke fungsi say_hello
kita tanpa mengubah kode itu!
Dekorator dengan Argumen
Tapi tunggu, masih ada lagi! Apa jika fungsi kita mengambil argumen? Tidak masalah! Kita dapat mengubah dekorator kita untuk menangani itu:
def my_decorator(func):
def wrapper(*args, **kwargs):
print("Sebelum fungsi dipanggil.")
result = func(*args, **kwargs)
print("Setelah fungsi dipanggil.")
return result
return wrapper
@my_decorator
def add(a, b):
return a + b
print(add(3, 5))
Ini akan menghasilkan output:
Sebelum fungsi dipanggil.
Setelah fungsi dipanggil.
8
Di sini, *args
dan **kwargs
memungkinkan dekorator kita untuk bekerja dengan jumlah argumen posisi dan kata kunci apa pun.
Dekorator Bawaan
Python datang dengan beberapa dekorator bawaan yang sangat berguna. Mari kita eksplorasi mereka!
Dekorator @classmethod
Dekorator @classmethod
digunakan untuk mendefinisikan metode yang beroperasi pada kelas itu sendiri, bukan pada instance kelas.
class Pizza:
def __init__(self, ingredients):
self.ingredients = ingredients
@classmethod
def margherita(cls):
return cls(['mozzarella', 'tomatoes'])
@classmethod
def prosciutto(cls):
return cls(['mozzarella', 'tomatoes', 'ham'])
print(Pizza.margherita().ingredients)
print(Pizza.prosciutto().ingredients)
Ini akan menghasilkan output:
['mozzarella', 'tomatoes']
['mozzarella', 'tomatoes', 'ham']
Di sini, margherita
dan prosciutto
adalah metode kelas yang membuat dan mengembalikan instance Pizza baru dengan bahan prakiraan.
Dekorator @staticmethod
Metode statis adalah metode yang tidak beroperasi pada instance atau kelas. Mereka hanya fungsi reguler yang terjadi untuk tinggal di dalam kelas.
class Math:
@staticmethod
def add(a, b):
return a + b
print(Math.add(5, 10))
Ini akan menghasilkan output:
15
Dekorator @property
Dekorator @property
memungkinkan Anda untuk mendefinisikan metode yang dapat Anda akses seperti atribut.
class Circle:
def __init__(self, radius):
self._radius = radius
@property
def radius(self):
return self._radius
@property
def area(self):
return 3.14 * self._radius ** 2
c = Circle(5)
print(c.radius)
print(c.area)
Ini akan menghasilkan output:
5
78.5
Di sini, kita dapat mengakses radius
dan area
seolah-olah mereka adalah atribut, tetapi mereka sebenarnya adalah metode.
Dekorator @functools.wraps
Dekorator ini digunakan untuk menjaga metadata dari fungsi asli ketika membuat dekorator.
from functools import wraps
def my_decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
"""Ini adalah fungsi wadah"""
return func(*args, **kwargs)
return wrapper
@my_decorator
def my_function():
"""Ini adalah fungsi saya"""
pass
print(my_function.__name__)
print(my_function.__doc__)
Ini akan menghasilkan output:
my_function
Ini adalah fungsi saya
Tanpa @wraps
, nama fungsi dan docstring akan adalah dari fungsi wadah.
Kesimpulan
Dekorator adalah fitur yang kuat di Python yang memungkinkan Anda untuk mengubah atau meningkatkan fungsi dan metode. Mereka banyak digunakan dalam kerangka dan pustaka untuk menambahkan fungsi seperti pelogging, kontrol akses, dan banyak lagi.
Ingat, kunci untuk menguasai dekorator adalah praktek. Cobalah untuk membuat dekorator Anda sendiri dan menerapkannya ke fungsi yang berbeda. Segera, Anda akan membungkus fungsi Anda dengan superpowers seperti pro!
Berikut adalah tabel yang ringkasan dekorator yang telah kita pelajari:
Dekorator | Tujuan |
---|---|
@classmethod |
Definisikan metode yang beroperasi pada kelas itu sendiri |
@staticmethod |
Definisikan metode yang tidak beroperasi pada instance atau kelas |
@property |
Definisikan metode yang dapat diakses seperti atribut |
@functools.wraps |
Menjaga metadata dari fungsi asli dalam dekorator |
Happy coding, dan semoga fungsi Anda selalu cantik yang didekorasi!
Credits: Image by storyset