Penyusun Python: Menambahkan Superpowers kepada Fungsi Anda

Helo kepada semua yang berhasrat menjadi pemrogram Python! Hari ini, kita akan menyelam ke dalam dunia yang menarik penyusun Python. Pikirkan penyusun sebagai pengepala penyusun yang dapat meningkatkan fungsi anda dengan superpowers. Menarik, kan? Mari kita mulakan perjalanan ini bersama-sama!

Python - Decorators

Apa itu Penyusun?

Bayangkan anda memiliki hadiah yang cantik dipenuhi. Kertas penutup tidak mengubah hadiah di dalamnya, tetapi membuatnya kelihatan lebih cantik, kan? Itulah yang penyusun lakukan kepada fungsi anda di dalam Python. Mereka membungkus di sekitar fungsi anda, menambahkan fungsi ekstra tanpa mengubah fungsi asalnya.

Mari kita mulakan dengan contoh sederhana:

def penyusun_saya(func):
def pengepala():
print("Ada sesuatu yang berlaku sebelum fungsi dipanggil.")
func()
print("Ada sesuatu yang berlaku selepas fungsi dipanggil.")
return pengepala

@penyusun_saya
def katakan_helo():
print("Helo!")

katakan_helo()

Jika anda menjalankan kod ini, anda akan lihat:

Ada sesuatu yang berlaku sebelum fungsi dipanggil.
Helo!
Ada sesuatu yang berlaku selepas fungsi dipanggil.

Mari kita kongsi ini:

  1. Kita definisikan fungsi penyusun penyusun_saya yang mengambil fungsi sebagai argumen.
  2. Di dalam penyusun_saya, kita definisikan fungsi pengepala yang menambah beberapa tingkah laku sebelum dan selepas memanggil fungsi asal.
  3. Kita gunakan sintaks @penyusun_saya untuk menerapkan penyusun kepada fungsi katakan_helo.
  4. Apabila kita memanggil katakan_helo(), sebenarnya adalah untuk memanggil versi yang dibungkus fungsi itu.

Bukan itu mudah? Kita baru saja menambah beberapa tingkah laku ekstra kepada fungsi katakan_helo kita tanpa mengubah kodnya!

Penyusun dengan Argumen

Tapi tunggu, masih ada lagi! Apa jika fungsi kita mengambil argumen? Tidak masalah! Kita boleh mengubah penyusun kita untuk menguruskan itu:

def penyusun_saya(func):
def pengepala(*args, **kwargs):
print("Sebelum fungsi dipanggil.")
hasil = func(*args, **kwargs)
print("Selepas fungsi dipanggil.")
return hasil
return pengepala

@penyusun_saya
def tambah(a, b):
return a + b

print(tambah(3, 5))

Ini akan output:

Sebelum fungsi dipanggil.
Selepas fungsi dipanggil.
8

Di sini, *args dan **kwargs membenarkan penyusun kita untuk bekerja dengan sebarang jumlah argumen posisi dan kata kunci.

Penyusun Terbina-Dalam

Python datang dengan beberapa penyusun terbina-dalam yang sangat berguna. Mari kita explore mereka!

Penyusun @classmethod

Penyusun @classmethod digunakan untuk definisikan method yang beroperasi di atas kelas itu sendiri, bukannya atas instance kelas.

class Pizza:
def __init__(self, bahan):
self.bahan = bahan

@classmethod
def margherita(cls):
return cls(['mozzarella', 'tomatoes'])

@classmethod
def prosciutto(cls):
return cls(['mozzarella', 'tomatoes', 'ham'])

print(Pizza.margherita().bahan)
print(Pizza.prosciutto().bahan)

Ini akan output:

['mozzarella', 'tomatoes']
['mozzarella', 'tomatoes', 'ham']

Di sini, margherita dan prosciutto adalah method kelas yang membuat dan mengembalikan instance Pizza baru dengan bahan yang telah ditetapkan.

Penyusun @staticmethod

Method statik adalah method yang tidak beroperasi di atas instance atau kelas. Mereka hanya fungsi biasa yang terjadi di atas kelas.

class Math:
@staticmethod
def tambah(a, b):
return a + b

print(Math.tambah(5, 10))

Ini akan output:

15

Penyusun @property

Penyusun @property membenarkan anda untuk definisikan method yang anda boleh akses seperti atribut.

class Circle:
def __init__(self, jejari):
self._jejari = jejari

@property
def jejari(self):
return self._jejari

@property
def luas(self):
return 3.14 * self._jejari ** 2

c = Circle(5)
print(c.jejari)
print(c.luas)

Ini akan output:

5
78.5

Di sini, kita boleh akses jejari dan luas seperti mereka adalah atribut, tetapi mereka sebenarnya adalah method.

Penyusun @functools.wraps

Penyusun ini digunakan untuk menjaga metadata dari fungsi asal ketika membuat penyusun.

from functools import wraps

def penyusun_saya(func):
@wraps(func)
def pengepala(*args, **kwargs):
"""Ini adalah fungsi pengepala"""
return func(*args, **kwargs)
return pengepala

@penyusun_saya
def fungsi_saya():
"""Ini adalah fungsi saya"""
pass

print(fungsi_saya.__name__)
print(fungsi_saya.__doc__)

Ini akan output:

fungsi_saya
Ini adalah fungsi saya

Tanpa @wraps, nama fungsi dan docstring akan menjadi dari fungsi pengepala.

Kesimpulan

Penyusun adalah fitur yang kuat di dalam Python yang membenarkan anda untuk mengubah atau meningkatkan fungsi dan method. Mereka banyak digunakan di dalam rakaman dan pustaka untuk menambahkan fungsi seperti pelog, pengawasan akses, dan lain-lain.

Ingat, kunci untuk menguasai penyusun adalah latihan. Cuba untuk membuat penyusun anda sendiri dan menerapkannya kepada fungsi berbeza. Bukan lama lagi, anda akan membungkus fungsi anda dengan superpowers seperti profesional!

Berikut adalah jadual yang mengsuming penyusun yang kita telah cuba:

Penyusun Tujuan
@classmethod Definisikan method yang beroperasi di atas kelas itu sendiri
@staticmethod Definisikan method yang tidak beroperasi di atas instance atau kelas
@property Definisikan method yang boleh diakses seperti atribut
@functools.wraps Jegakan metadata dari fungsi asal di penyusun

Selamat untuk pengoding, dan may fungsi anda sentiasa dihiasi dengan indah!

Credits: Image by storyset