Dekorator Python: Fungsi Pembungkus & Memodifikasi

Pelajari dekorator Python untuk mengubah perilaku fungsi secara dinamis. Pahami fungsi wrapper, @ sintaksis, dan argumen penanganan di dekorator.

Coba di Editor

Ikhtisar

Dekorator adalah salah satu pola desain Python yang paling elegan dan kuat. Mereka mengizinkan pengembang untuk memodifikasi atau memperluas perilaku suatu fungsi, metode, atau kelas tanpa mengubah kode sumbernya secara permanen. Bayangkan dekorator membungkus suatu fungsi di dalam fungsi lain untuk menjalankan langkah-langkah sebelum dan sesudah pemrosesan. Hal ini membuat dekorator sempurna untuk menerapkan masalah lintas sektoral seperti logging, pengaturan waktu, validasi, atau kontrol akses.

Pada intinya, dekorator bekerja karena fungsi Python adalah warga negara kelas satu. Ini berarti fungsi dapat diteruskan sebagai argumen ke fungsi lain, dikembalikan dari fungsi, dan ditetapkan ke variabel. Dekorator hanyalah sebuah fungsi yang mengambil fungsi lain sebagai argumen, mendefinisikan fungsi pembungkus bersarang yang menjalankan fungsi asli bersama dengan beberapa logika tambahan, dan mengembalikan fungsi pembungkus ini untuk menggantikan fungsi asli.

Untuk membuat penerapan dekorator menjadi sederhana dan bersih, Python menyediakan gula sintaksis `@decorator_name`, yang ditempatkan tepat di atas definisi fungsi target. Saat memanggil fungsi yang dihias, Python malah memanggil pembungkusnya. Jika fungsi menerima parameter, wrapper harus menerima argumen arbitrer (`*args` dan `**kwargs`) dan meneruskannya dengan benar. Memahami dekorator memungkinkan Anda menulis kode yang sangat modular, bersih, dan KERING (Jangan Ulangi Sendiri).

Kode & Output Eksekusi

Dekorator khusus yang melacak dan mencatat detail eksekusi fungsi.

decorators.py
Coba di Editor
def call_tracker(func):
    """Decorator that tracks and logs function execution details."""
    def wrapper(*args, **kwargs):
        print(f"Calling {func.__name__} with args: {args}")
        result = func(*args, **kwargs)
        print(f"{func.__name__} returned: {result}")
        return result
    return wrapper

@call_tracker
def multiply(a, b):
    return a * b

# Calling the decorated function
result = multiply(5, 4)
Keluaran Terminal
Calling multiply with args: (5, 4)
multiply returned: 20

Implementasi Langkah demi Langkah

  • Mencatat metrik waktu proses ke monitor kinerja
  • Menerapkan pemeriksaan otentikasi dan otorisasi pada rute
  • Menyimpan atau menyimpan hasil komputasi yang mahal

Pertanyaan yang Sering Diajukan

Bagaimana cara dekorator menangani argumen?

Dengan menggunakan *args dan **kwargs dalam fungsi wrapper bersarang, yang memungkinkannya menerima dan meneruskan parameter posisi atau kata kunci apa pun ke fungsi wrapper.

Bisakah Anda menerapkan banyak dekorator ke satu fungsi?

Ya, Anda bisa menumpuknya. Mereka akan dieksekusi secara berurutan dari atas ke bawah (bungkus terdalam hingga terluar).

Topik Terkait

Sumber Daya Python yang Direkomendasikan

Perluas pengetahuan Anda dengan tutorial interaktif terkait, lembar contekan, dan perbandingan kode.