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!
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:
- Kita definisikan fungsi penyusun
penyusun_saya
yang mengambil fungsi sebagai argumen. - Di dalam
penyusun_saya
, kita definisikan fungsipengepala
yang menambah beberapa tingkah laku sebelum dan selepas memanggil fungsi asal. - Kita gunakan sintaks
@penyusun_saya
untuk menerapkan penyusun kepada fungsikatakan_helo
. - 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