Definisi: Dekorator adalah pola desain dengan Python. Ini adalah fungsi yang mengambil fungsi lain sebagai argumen, menambahkan beberapa fungsi ke dalamnya tanpa memodifikasinya, dan mengembalikan fungsi lain.
Ini disebut menggunakan “(@)” dan ditempatkan sebelum mendefinisikan fungsi yang ingin kita hias.
sintaksis:
@nama dekorator
Definisi fungsi
Untuk memahami dekorator, kita perlu mengetahui konsep di bawah ini.
Fungsi adalah objek kelas satu. Artinya suatu fungsi dapat diteruskan sebagai argumen, dapat dikembalikan dari fungsi lain, dapat ditetapkan ke variabel, dapat didefinisikan dalam fungsi lain. Untuk pemahaman yang lebih baik, lihat contoh di bawah ini.
- Sebuah fungsi dapat dilewatkan sebagai argumen
Ex: kenaikan def (n):
kembali n + 1
def demo_funcall (fungsi):
bilangan = 5
fungsi pengembalian (angka)
demo_funcall (kenaikan)Di sini fungsi kenaikan dilewatkan sebagai argumen
Contoh 1.py:
Keluaran:
>> contoh python1.py
- Fungsi dapat dikembalikan dari fungsi lain
Ex: keinginan pasti():
def say_wish():
kembali "Selamat Ulang Tahun"
kembali say_wish
halo = keinginan()
Halo()contoh2.py:
Keluaran:
>> contoh python2.py
Di sini fungsi say_wish dikembalikan dari fungsi keinginan - Fungsi dapat dimodifikasi dan ditugaskan ke variabel
Ex: def tambahkan(a,b):
kembalikan a +b
sum2nos = add # Di sini fungsi add ditugaskan ke variabel
jumlah2no(5,11)contoh3.py:
Keluaran:
>> contoh python3.py
- Tentukan fungsi di dalam fungsi lain
Ex: def tambahkan(a,b):
def jumlah2(a,b):
kembalikan a + b
res = jumlah2(a,b)
kembalikan res
tambahkan(10,15)contoh4.py:
Keluaran:
>> contoh python4.py
Penutupan:
Python memungkinkan fungsi bersarang untuk mengakses lingkup luar dari fungsi terlampir.
salam def (pesan):"Fungsi Enclosong"
def send_greeting():
"Fungsi Bersarang"
cetak (pesan)
kirim_salam()
salam("Selamat pagi")
contoh5.py:
Keluaran:
>> contoh python5.py
Setelah memahami konsep di atas sekarang, kami akan menulis contoh dekorator.
Contoh1: Di sini, kita akan mendekorasi fungsi pesan. Mencetak pesan di dalam **** tanpa mengubah fungsi aslinya, i.e., fungsi pesan.
#dekorator mulaidef print_msg(fungsi):
def pembungkus():
fungsi()
bungkus kembali
#dekorator selesai
def pesan():
print("Ini adalah contoh pertama untuk mendemonstrasikan dekorator")
halo = print_msg(pesan)
Halo()
contoh6.py:
Keluaran:
>> contoh python6.py
Dalam bentuk paling sederhana, kita dapat menempatkan dekorator di atas definisi fungsi dan memanggil fungsi seperti yang ditunjukkan di bawah ini:
Di sini tali apa pun yang ingin kita hias di dalamnya, gunakan dekorator ini.
Keluaran:
Beberapa dekorator:
Kami dapat memiliki beberapa dekorator untuk satu fungsi. Di sini dekorator diterapkan dalam urutan yang kami sebut.
sintaksis:
@dekorator2
@dekorator1
Definisi fungsi
Di sini dekorator pertama akan diterapkan, kemudian dekorator kedua.
Melewati argumen ke fungsi dekorator:
Kita dapat meneruskan argumen ke fungsi pembungkus. Argumen yang diteruskan ke fungsi yang ingin kita hias.
Ex:
def deco_wish(fungsi):pembungkus def (arg1, arg2):
print ('Argumen yang diteruskan adalah ',arg1, arg2)
cetak ('*********************')
fungsi (arg1, arg2)
cetak ('*********************')
bungkus kembali
@deco_wish
keinginan def (a1, a2):
cetak(a1,a2)
berharap ('Selamat', 'Pagi')
berharap ('Selamat', 'Siang')
contoh7.py:
Keluaran:
>> contoh python7.py
Lewati jumlah variabel argumen ke fungsi dekorator:
Kita dapat melewatkan sejumlah argumen menggunakan *args (Argumen non-kata kunci seperti angka) dan **kwargs (argumen kata kunci seperti kamus). Keduanya adalah argumen posisi dan menyimpan argumen dalam variabel args dan kwargsgs.
Catatan: Di sini, kita dapat menggunakan nama apa pun selain args dan kwargs, tetapi nama-nama ini disarankan untuk digunakan.
Ex:
def dec_var_args(fungsi):def wrapper(*args, **kwargs):
print('Argumen non kata kunci adalah', args)
print('Argumen kata kunci adalah', kwargs)
fungsi(*args)
bungkus kembali
@ dec_var_args
def fun_non_key_args(*args):
untuk saya di args:
cetak (i)
@ dec_var_args
def fun_key_args():
print("Argumen kata kunci")
fun_non_key_args((4,5,6))
fun_key_args(fname='Anand', lname='Matematika')
contoh8.py:
Keluaran:
>> contoh python8.py
Contoh2: Misalkan kita memiliki 2 fungsi
Fungsi1: Hitung jumlah angka dari daftar yang diberikan
Fungsi2: Kalikan setiap angka dengan 2 dan tambahkan ke daftar angka yang diberikan
Jika kita ingin menghitung waktu yang dibutuhkan oleh masing-masing untuk eksekusi, dapat dilakukan dengan 2 cara
- Tempatkan kode di antara waktu mulai dan berakhir di setiap fungsi
- Tulis dekorator untuk menghitung waktu
Lihat kode di bawah ini diselesaikan menggunakan dekorator:
#dekorator mulaiexe_time_calc(fungsi):
pembungkus def (arg):
start_time = waktu tanggal.tanggal Waktu.sekarang()
fungsi(arg)
end_time = waktu tanggal.tanggal Waktu.sekarang()
print("Waktu yang dibutuhkan untuk menjalankan fungsi " + func.__name__ + " adalah " + str(end_time - end_time))
bungkus kembali
#dekorator selesai
@exe_time_calc
def cal_avg(data):
jumlah = 0
untuk saya dalam data:
jumlah += i
print("Rata-rata daftar bilangan yang diberikan adalah ", sum//len(data))
@exe_time_calc
def mul_by_2(data):
jumlah = 0
untuk saya dalam data:
jumlah += + (i*2)
print("Jumlah semua bilangan setelah dikalikan 2 adalah ", jumlah)
cal_avg ([10,20,30,40,50])
mul_by_2([10,20,30,40,50])
contoh9.py:
Keluaran:
>> contoh python9.py
Dekorator di atas dapat digunakan untuk menghitung waktu eksekusi untuk salah satu fungsi. Dengan menggunakan dekorator, kita dapat menghindari kode berulang ketika kita memiliki persyaratan untuk menghitung waktu eksekusi untuk menempatkan dekorator di atas definisi fungsi.
Kesimpulan:
Dekorator mengubah fungsionalitas suatu fungsi/metode tanpa mengubah kode asli dari fungsi yang sedang didekorasi. Dengan menggunakan ini, kita dapat menghindari penulisan kode berulang. Mengetahui konsep dekorator akan membuat kita kuat di python. Kita dapat menggunakan dekorator dalam kasus di bawah ini:
- Otorisasi dalam kerangka kerja Python Contoh: Flask dan Django
- Pencatatan
- Ukur waktu eksekusi