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!

Python - Decorators

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:

  1. Kita definisikan fungsi dekorator my_decorator yang mengambil fungsi sebagai argumen.
  2. Di dalam my_decorator, kita definisikan fungsi wrapper yang menambahkan beberapa perilaku sebelum dan setelah memanggil fungsi asli.
  3. Kita menggunakan sintaks @my_decorator untuk menerapkan dekorator kita ke fungsi say_hello.
  4. 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