Apa itu dekorator dalam contoh sederhana python?

Dekorator dalam Python adalah fungsi yang menggunakan fungsi lain sebagai argumen dan memperluas perilakunya tanpa memodifikasinya secara eksplisit. Ini adalah salah satu fitur Python yang paling kuat. Ini memiliki beberapa penggunaan di dunia nyata seperti logging, debugging, otentikasi, mengukur waktu eksekusi, dan banyak lagi

Ruang Lingkup Pasal

  • Artikel ini mendefinisikan dekorator dengan Python
  • Pertama-tama kita membahas prasyarat dan kemudian mempelajari lebih lanjut tentang dekorator dan cara menggunakannya dengan benar dengan fungsi dan kelas
  • Kami juga membahas penggunaan dekorator di dunia nyata dalam Pemrograman Python

Perkenalan

Misalkan Anda memiliki sekumpulan fungsi dan Anda hanya ingin pengguna yang diautentikasi untuk mengaksesnya

Oleh karena itu, Anda perlu memeriksa apakah pengguna diautentikasi atau tidak sebelum melanjutkan dengan kode lainnya di dalam fungsi

Salah satu cara untuk melakukannya adalah dengan memanggil fungsi terpisah di dalam semua fungsi dan menggunakan pernyataan bersyarat. Tapi ini mengharuskan kita mengubah kode untuk setiap fungsi

Solusi yang lebih baik di sini adalah menggunakan Dekorator

Dekorator hanyalah sebuah fungsi yang mengambil fungsi lain sebagai argumen dan memperluas perilakunya tanpa memodifikasinya secara eksplisit

Ini berarti dekorator menambahkan fungsionalitas baru ke suatu fungsi

Di akhir artikel ini, Anda akan memahami apa artinya "memperluas fungsi tanpa benar-benar memodifikasinya".

Prasyarat untuk Belajar Dekorator

Untuk memahami dekorator dengan Python, Anda harus memiliki pemahaman tentang konsep-konsep berikut

  • Bagaimana fungsi bekerja
  • Objek Kelas Satu
  • Fungsi Dalam
  • Fungsi Tingkat Tinggi

Jangan khawatir. Kita akan membahas hal-hal ini di bagian selanjutnya. Jika Anda sudah terbiasa, silakan lewati

Membawa pergi

  • Dekorator adalah fungsi yang mengambil fungsi lain dan memperluas perilaku fungsi terakhir tanpa mengubahnya secara eksplisit

Fungsi dalam Python

Fungsi mengembalikan nilai berdasarkan argumen yang diberikan

Misalnya, fungsi berikut mengembalikan dua kali angka

def twice(number):
    return number * 2

Suatu fungsi mungkin juga memiliki efek samping seperti fungsi cetak. Fungsi cetak mengembalikan Tidak Ada sambil memiliki efek samping mengeluarkan string yang diberikan ke konsol

Objek Kelas Satu

Dalam Python, suatu fungsi diperlakukan sebagai objek kelas satu. Ini berarti bahwa suatu fungsi memiliki semua hak seperti variabel lainnya dalam bahasa

Itu sebabnya, kita dapat menetapkan fungsi ke variabel, meneruskannya ke fungsi, atau mengembalikannya dari fungsi. Sama seperti variabel lainnya

Menetapkan fungsi ke variabel

Anda dapat menetapkan fungsi ke variabel sebagai berikut

def foo():
  print("I am foo")

also_foo = foo

foo()
also_foo()
_

Keluaran

Penjelasan

Karena semuanya adalah objek dalam Python, nama yang kita definisikan hanyalah pengidentifikasi yang mereferensikan objek-objek ini

Jadi, foo dan also_foo menunjuk ke objek fungsi yang sama seperti yang ditunjukkan di bawah dalam diagram

Apa itu dekorator dalam contoh sederhana python?

Itu sebabnya kami mendapat output yang sama dari kedua pemanggilan fungsi

Melewati fungsi ke fungsi lain

Ada beberapa kasus penggunaan untuk meneruskan fungsi sebagai argumen ke fungsi lain di Python. Misalnya, meneruskan fungsi kunci untuk mengurutkan daftar. Dekorator juga menggunakan teknik ini seperti yang akan kita lihat nanti

Suatu fungsi dapat diteruskan ke fungsi lain seperti variabel normal sebagai berikut

def do_twice(func):
  func()
  func()

def say_hello():
  print("Hello!")

do_twice(say_hello)

Keluaran

Penjelasan

Fungsi do_twice menerima fungsi dan memanggilnya dua kali dalam tubuhnya. Kami mendefinisikan fungsi lain say_hello dan meneruskannya ke fungsi do_twice, sehingga mendapatkan Hello. dua kali dalam output

Mengembalikan fungsi dari suatu fungsi

Mengembalikan fungsi dari suatu fungsi adalah teknik lain yang digunakan oleh dekorator di Python

Kami dapat mengembalikan fungsi dari fungsi sebagai berikut

def return_to_upper():
  return str.upper

to_upper = return_to_upper()

print(to_upper("scaler topics"))

Keluaran

Penjelasan

Sebagai ilustrasi, kami mengembalikan metode atas str dari fungsi return_to_upper. Kami memanggil fungsi dan menyimpan referensi ke fungsi yang dikembalikan di to_upper. Kemudian gunakan untuk mencetak huruf besar "topik penskalaan"

Fungsi tingkat tinggi adalah fungsi yang mengambil fungsi sebagai argumen atau mengembalikan fungsi

Fungsi Dalam

Kita dapat mendefinisikan suatu fungsi di dalam fungsi lainnya. Fungsi seperti itu disebut fungsi dalam atau fungsi bersarang. Dekorator di Python juga menggunakan fungsi dalam

Sebagai contoh, berikut adalah fungsi dengan dua fungsi dalam

def parent():
  print("I am the parent function")

  def first_child():
    print("I am the first child function")

  def second_child():
    print("I am the second child function")

  first_child()
  second_child()

parent()
_

Keluaran

I am the parent function
I am the first child function
I am the second child function

Penjelasan

Kami membuat dua fungsi di dalam induk fungsi dan kemudian memanggil keduanya di badan fungsi induk. Urutan di mana kita mendefinisikan fungsi bagian dalam tidak menjadi masalah. Outputnya hanya bergantung pada urutan pemanggilan fungsi

Catatan 📝

Fungsi dalam dicakup secara lokal ke induknya. Mereka tidak tersedia di luar fungsi induk. Jika Anda mencoba memanggil anak_pertama di luar badan induk, Anda akan mendapatkan NameError

Fungsi dalam dapat mengakses variabel di lingkup luar fungsi terlampir. Pola ini dikenal sebagai Penutupan

Perhatikan contoh berikut

def outer(message):
  def inner():
    print("Message:", message)

  return inner

hello_msg = outer("Hello!")
hello_msg()

bye_msg = outer("Bye!")
bye_msg()
_

Keluaran

Message: Hello!
Message: Bye!

Penjelasan

Pesan diingat oleh fungsi dalam bahkan setelah fungsi luar selesai dieksekusi. Teknik di mana beberapa data dilampirkan ke kode ini disebut penutupan dengan Python

Membawa pergi

  • Fungsi adalah objek kelas satu di Python

Pengantar Dekorator

Sekarang kita memiliki pengetahuan prasyarat untuk memahami dekorator, mari kita lanjutkan belajar tentang dekorator Python

Seperti yang telah dibahas sebelumnya, dekorator dalam Python digunakan untuk memodifikasi perilaku suatu fungsi tanpa benar-benar mengubahnya

Sintaksis

dimana func adalah fungsi yang dihias dan dekorator adalah fungsi yang digunakan untuk menghiasnya

Mari kita lihat contoh untuk memahami apa artinya ini

def decorator(func):
  def wrapper():
    print("This is printed before the function is called")
    func()
    print("This is printed after the function is called")
  
  return wrapper

def say_hello():
  print("Hello! The function is executing")


say_hello = decorator(say_hello)

say_hello()
_

Keluaran

This is printed before the function is called
Hello! The function is executing
This is printed after the function is called
_

Penjelasan

Kami memiliki dua fungsi di sini

  • penghias. Ini adalah fungsi dekorator, ia menerima fungsi lain sebagai argumen dan "menghiasinya" yang berarti memodifikasinya dengan cara tertentu dan mengembalikan versi yang dimodifikasi
    Di dalam fungsi dekorator, kita mendefinisikan fungsi dalam lain yang disebut pembungkus. Ini adalah fungsi aktual yang melakukan modifikasi dengan membungkus fungsi yang diteruskan func
    dekorator mengembalikan fungsi pembungkus
  • katakan halo. Ini adalah fungsi biasa yang perlu kita hias. Di sini, yang dilakukan hanyalah mencetak pernyataan sederhana

Baris paling penting dalam kode adalah ini

def foo():
  print("I am foo")

also_foo = foo

foo()
also_foo()
_0

Kami meneruskan fungsi say_hello ke fungsi dekorator. Akibatnya, say_hello sekarang menunjuk ke fungsi pembungkus yang dikembalikan oleh dekorator
Namun, fungsi pembungkus memiliki referensi ke say_hello() asli sebagai func, dan memanggil fungsi tersebut di antara dua panggilan ke print()

Membawa pergi

  • Fungsi dekorator memodifikasi fungsi dengan membungkusnya dalam fungsi pembungkus

Dekorator Sintaksis

Pola dekorator di atas menjadi populer di komunitas Python tetapi agak janggal. Kita harus menulis nama fungsi tiga kali dan dekorasinya agak tersembunyi di bawah definisi fungsi

Oleh karena itu, Python memperkenalkan cara baru untuk menggunakan dekorator dengan menyediakan gula sintaksis dengan simbol @

Sintaksis

def foo():
  print("I am foo")

also_foo = foo

foo()
also_foo()
_1

Gula sintaksis adalah sintaks dalam bahasa pemrograman yang dirancang untuk membuat sesuatu lebih mudah dibaca atau diekspresikan

Contoh berikut melakukan hal yang sama seperti contoh sebelumnya

def foo():
  print("I am foo")

also_foo = foo

foo()
also_foo()
_2

Keluaran

This is printed before the function is called
Hello! The function is executing
This is printed after the function is called
_

Penjelasan

Keluaran dan kerjanya sama dengan contoh sebelumnya, satu-satunya hal yang berubah adalah kita menggunakan @decorator alih-alih say_hello = dekorator(say_hello)

Membawa pergi

  • Kita dapat dengan mudah mendekorasi sebuah fungsi menggunakan sintaks @decorator

Mempertahankan Nama Asli dan Docstring dari Fungsi yang Dihiasi

Dalam Python, fungsi memiliki atribut nama dan docstring untuk membantu proses debug dan dokumentasi
Namun, saat kita mendekorasi sebuah fungsi, identitasnya diubah menjadi fungsi pembungkus

Lihat contoh berikut (kami menggunakan dekorator yang sama yang dibuat sebelumnya)

def foo():
  print("I am foo")

also_foo = foo

foo()
also_foo()
_4

Keluaran

def foo():
  print("I am foo")

also_foo = foo

foo()
also_foo()
_5

Meskipun secara teknis benar, ini bukanlah yang kami inginkan. Karena say_hello sekarang menunjuk ke fungsi pembungkus, ia menampilkan informasinya alih-alih fungsi aslinya

Untuk memperbaikinya, kita perlu menggunakan dekorator lain bernama wraps pada fungsi wrapper

Dekorator wraps diimpor dari modul functools bawaan

Beginilah Cara kita melakukanya

def foo():
  print("I am foo")

also_foo = foo

foo()
also_foo()
_6

Keluaran

def foo():
  print("I am foo")

also_foo = foo

foo()
also_foo()
_7

Kali ini, kami mendapatkan docstring yang benar dari fungsi bantuan dan nama yang benar dari atribut __name__

Membawa pergi

  • Gunakan functools. membungkus dekorator untuk mempertahankan nama asli dan docstring dari fungsi yang didekorasi

Menggunakan kembali Dekorator

Dekorator hanyalah fungsi Python biasa. Oleh karena itu, kita dapat menggunakannya kembali untuk mendekorasi berbagai fungsi

Mari buat sebuah file bernama dekorator. py dengan kode berikut

def foo():
  print("I am foo")

also_foo = foo

foo()
also_foo()
_8

do_twice adalah dekorator sederhana yang memanggil fungsi yang didekorasi dua kali

Sekarang, Anda dapat menggunakan kembali dekorator do_twice beberapa kali dengan mengimpornya

Ini sebuah contoh

def foo():
  print("I am foo")

also_foo = foo

foo()
also_foo()
_9

Keluaran

Penjelasan

Kami mengimpor any menggunakan dekorator do_twice pada kedua fungsi dan memanggilnya. Oleh karena itu, kami mendapat dua keluaran untuk setiap fungsi

Membawa pergi

  • Dekorator dapat digunakan kembali seperti fungsi lainnya

Fungsi Dekorator dengan Parameter

Bagaimana jika fungsi yang kita dekorasi memiliki beberapa parameter?

Mari kita coba dengan sebuah contoh

def do_twice(func):
  func()
  func()

def say_hello():
  print("Hello!")

do_twice(say_hello)
0

Keluaran

def do_twice(func):
  func()
  func()

def say_hello():
  print("Hello!")

do_twice(say_hello)
1

Penjelasan

Kami mendapat kesalahan karena fungsi pembungkus yang kami definisikan di dalam dekorator tidak menerima argumen apa pun

Cara langsung untuk menyelesaikan ini adalah dengan membiarkan pembungkus menerima satu argumen, tetapi kemudian kita tidak akan dapat menggunakan dekorator do_twice dengan fungsi dengan lebih dari satu argumen

Jadi, solusi yang lebih baik adalah menerima sejumlah variabel argumen dalam fungsi pembungkus dan kemudian meneruskan argumen tersebut ke fungsi asli func

Inilah cara Anda melakukannya

def do_twice(func):
  func()
  func()

def say_hello():
  print("Hello!")

do_twice(say_hello)
2

Keluaran

def do_twice(func):
  func()
  func()

def say_hello():
  print("Hello!")

do_twice(say_hello)
_3

Penjelasan

*args dan **kwargs memungkinkan kita untuk meneruskan beberapa argumen atau argumen kata kunci ke suatu fungsi
Jadi, kami memberikan "Kitty" sebagai nama ke say_hello yang diterima oleh fungsi pembungkus dan fungsi pembungkus menggunakannya untuk memanggil fungsi func yang sebenarnya. Mengeluarkan Hello, Kitty. dua kali

Membawa pergi

  • Gunakan sejumlah variabel parameter dalam fungsi pembungkus untuk menangani sejumlah argumen dalam fungsi yang didekorasi

Mengembalikan Nilai dari Fungsi yang Dihiasi

Apa yang terjadi pada nilai yang dikembalikan dari fungsi yang didekorasi?

Pertimbangkan fungsi add berikut, ia mencetak pernyataan lalu mengembalikan jumlah dari dua angka, kami menghiasnya dengan dekorator do_twice yang dibuat sebelumnya

def do_twice(func):
  func()
  func()

def say_hello():
  print("Hello!")

do_twice(say_hello)
_4

Keluaran

def do_twice(func):
  func()
  func()

def say_hello():
  print("Hello!")

do_twice(say_hello)
5

Fungsi add dipanggil dua kali seperti yang diharapkan tetapi kami mendapatkan Tidak ada dalam nilai kembalian. Ini karena fungsi pembungkus tidak mengembalikan nilai apa pun

Untuk memperbaikinya, kita perlu memastikan bahwa fungsi wrapper mengembalikan nilai kembalian dari fungsi yang didekorasi

Inilah cara Anda melakukannya

def do_twice(func):
  func()
  func()

def say_hello():
  print("Hello!")

do_twice(say_hello)
6

Keluaran

def do_twice(func):
  func()
  func()

def say_hello():
  print("Hello!")

do_twice(say_hello)
7

Penjelasan

Kami memanggil fungsi dua kali dalam fungsi pembungkus. Namun kali ini, kami memastikan untuk mengembalikan nilai panggilan kedua kembali ke penelepon

Sekarang, kita mendapatkan jumlah yang benar

Membawa pergi

  • Fungsi pembungkus harus mengembalikan nilai kembalian dari fungsi yang dihias, jika tidak, akan hilang

Dekorator dengan Argumen

Anda dapat meneruskan argumen ke dekorator itu sendiri
Yang perlu Anda lakukan hanyalah mendefinisikan dekorator di dalam fungsi lain yang menerima argumen dan kemudian menggunakan argumen tersebut di dalam dekorator. Anda juga perlu mengembalikan dekorator dari fungsi penutup

Mari kita lihat apa artinya ini dengan kode untuk lebih memahaminya

Sebelumnya, kita membuat dekorator bernama do_twice. Sekarang, kami akan memperpanjangnya untuk mengulang beberapa kali. Sebut saja pengulangan dekorator baru ini

def do_twice(func):
  func()
  func()

def say_hello():
  print("Hello!")

do_twice(say_hello)
_8

Keluaran

def do_twice(func):
  func()
  func()

def say_hello():
  print("Hello!")

do_twice(say_hello)
_9

Penjelasan

Mari kita pecahkan kodenya

  • Pembungkus fungsi paling dalam mengambil sejumlah variabel argumen dan kemudian memanggil fungsi yang didekorasi num_times kali. Ini akhirnya mengembalikan nilai kembalian dari fungsi asli yang didekorasi

def return_to_upper():
  return str.upper

to_upper = return_to_upper()

print(to_upper("scaler topics"))
0
  • Satu tingkat di atas adalah fungsi dekorator_repeat yang melakukan pekerjaan dekorator normal, ia mengembalikan fungsi pembungkus

def return_to_upper():
  return str.upper

to_upper = return_to_upper()

print(to_upper("scaler topics"))
1
  • Pada tingkat terluar adalah fungsi dekorator berulang yang menerima argumen dan memberikannya ke fungsi bagian dalam menggunakan pola penutupan

def return_to_upper():
  return str.upper

to_upper = return_to_upper()

print(to_upper("scaler topics"))
2

Akhirnya, kami menggunakan dekorator dengan tanda kurung () tidak seperti sebelumnya untuk memberikan argumen

Kesimpulan,

def return_to_upper():
  return str.upper

to_upper = return_to_upper()

print(to_upper("scaler topics"))
_3

Setara dengan

def return_to_upper():
  return str.upper

to_upper = return_to_upper()

print(to_upper("scaler topics"))
_4

Artinya, repeat dipanggil dengan argumen yang diberikan dan kemudian nilai pengembaliannya (dekorator sebenarnya) dipanggil dengan fungsi say_hello

Dekorator dengan argumen digunakan sebagai pabrik dekorator untuk membuat dekorator baru

Membawa pergi

  • Anda dapat meneruskan argumen ke dekorator dengan membungkusnya di dalam fungsi dekorator lain

Dekorator Rantai

Merangkai dekorator berarti kita dapat menerapkan banyak dekorator ke satu fungsi. Ini juga disebut dekorator bersarang

Pertimbangkan dua dekorator berikut

def return_to_upper():
  return str.upper

to_upper = return_to_upper()

print(to_upper("scaler topics"))
5
  • Yang pertama mengambil fungsi yang mengembalikan string dan kemudian membaginya menjadi daftar kata
  • Yang kedua mengambil fungsi yang mengembalikan string dan mengubahnya menjadi huruf besar

Sekarang, kita akan menggunakan kedua dekorator pada satu fungsi dengan menumpuknya seperti ini

def return_to_upper():
  return str.upper

to_upper = return_to_upper()

print(to_upper("scaler topics"))
6

Keluaran

Penjelasan

Urutan dekorator penting dalam hal ini. To_upper pertama diterapkan ke fungsi say_hello. Kemudian, split_string diterapkan

def return_to_upper():
  return str.upper

to_upper = return_to_upper()

print(to_upper("scaler topics"))
_7

setara dengan

def return_to_upper():
  return str.upper

to_upper = return_to_upper()

print(to_upper("scaler topics"))
8

Membawa pergi

  • Anda dapat menerapkan beberapa dekorator ke satu fungsi dengan menumpuknya di atas satu sama lain

Dekorator Mewah

Anda memerlukan pemahaman dasar tentang class di Python untuk bagian ini

Saya merekomendasikan untuk membaca artikel Kelas dalam Python di Topik Scaler jika Anda tidak terbiasa dengan kelas

Sampai sekarang, Anda telah melihat bagaimana menggunakan dekorator pada fungsi. Anda juga dapat menggunakan dekorator dengan kelas, ini dikenal sebagai dekorator mewah di Python. Ada dua cara yang mungkin untuk melakukan ini

  • Dekorasi metode kelas
  • Dekorasi kelas yang lengkap

Dekorasi Metode Kelas

Python menyediakan dekorator bawaan berikut untuk digunakan dengan metode kelas

  • @metodekelas. Ini digunakan untuk membuat metode yang terikat ke kelas dan bukan objek kelas. Itu dibagikan di antara semua objek kelas itu. Kelas dilewatkan sebagai parameter pertama ke metode kelas. Metode kelas sering digunakan sebagai metode pabrik yang dapat membuat instance kelas tertentu
  • @metode statis. Metode statis tidak dapat memodifikasi status objek atau status kelas karena mereka tidak memiliki akses ke cls atau self. Mereka hanyalah bagian dari ruang nama kelas
  • @Properti. Ini digunakan untuk membuat getter dan setter untuk atribut kelas

Mari kita lihat contoh dari ketiga dekorator tersebut

def return_to_upper():
  return str.upper

to_upper = return_to_upper()

print(to_upper("scaler topics"))
_9

Penjelasan

Kami membuat kelas yang disebut Browser. Kelas berisi pengambil dan penyetel untuk atribut halaman yang dibuat dengan dekorator @property

Ini berisi metode kelas yang disebut with_incognito yang bertindak sebagai metode pabrik untuk membuat objek jendela penyamaran

Itu juga berisi metode statis untuk mendapatkan informasi untuk browser yang akan sama untuk semua objek (windows)

Dekorasi Kelas Lengkap

Anda juga dapat menggunakan dekorator di seluruh kelas

Menulis dekorator kelas sangat mirip dengan menulis dekorator fungsi. Satu-satunya perbedaan adalah dekorator akan menerima kelas dan bukan fungsi sebagai argumen. Dekorasi kelas tidak menghiasi metodenya. Ini setara dengan yang berikut ini

def parent():
  print("I am the parent function")

  def first_child():
    print("I am the first child function")

  def second_child():
    print("I am the second child function")

  first_child()
  second_child()

parent()
_0

Itu hanya menambahkan fungsionalitas ke proses instantiasi kelas

Salah satu contoh paling umum menggunakan dekorator di kelas adalah @dataclass dari modul dataclasses

def parent():
  print("I am the parent function")

  def first_child():
    print("I am the first child function")

  def second_child():
    print("I am the second child function")

  first_child()
  second_child()

parent()
_1

Kelas data adalah kelas yang sebagian besar berisi data. Muncul dengan fungsionalitas dasar yang sudah diterapkan. Kita dapat membuat instance, mencetak, dan membandingkan instance kelas data secara langsung

Nama pengguna. sintaks str disebut tipe petunjuk di Python. Petunjuk jenis adalah sintaks khusus yang memungkinkan untuk mendeklarasikan jenis variabel
Editor dan alat menggunakan jenis petunjuk ini untuk memberikan dukungan yang lebih baik seperti pelengkapan otomatis dan pemeriksaan kesalahan

Dalam contoh, kami telah membuat kelas bernama Pengguna yang menyimpan data yang terkait dengan pengguna. Kemudian, kami membuat pengguna dan mencetak nama penggunanya

Membawa pergi

  • Dekorator dapat digunakan dengan metode kelas atau seluruh kelas

Kelas sebagai Dekorator

Kita juga bisa menggunakan class sebagai dekorator. Kelas adalah opsi terbaik untuk menyimpan status beberapa data, jadi mari kita pahami cara mengimplementasikan dekorator stateful dengan kelas yang akan mencatat jumlah panggilan yang dibuat untuk suatu fungsi

Ada dua persyaratan untuk menjadikan kelas sebagai dekorator

  • Fungsi __init__ perlu menggunakan fungsi sebagai argumen
  • Kelas perlu mengimplementasikan metode __call__. Ini diperlukan karena kelas akan digunakan sebagai dekorator dan dekorator harus berupa objek yang dapat dipanggil

Perhatikan juga bahwa kami menggunakan functools. update_wrapper bukan functools. membungkus dalam kasus kelas sebagai dekorator

Sekarang, mari kita terapkan kelasnya

def parent():
  print("I am the parent function")

  def first_child():
    print("I am the first child function")

  def second_child():
    print("I am the second child function")

  first_child()
  second_child()

parent()
_2

Sekarang, gunakan kelas sebagai dekorator sebagai berikut

def parent():
  print("I am the parent function")

  def first_child():
    print("I am the first child function")

  def second_child():
    print("I am the second child function")

  first_child()
  second_child()

parent()
_3

Setelah dekorasi, metode __call__ kelas dipanggil sebagai ganti metode say_hello

Keluaran

def parent():
  print("I am the parent function")

  def first_child():
    print("I am the first child function")

  def second_child():
    print("I am the second child function")

  first_child()
  second_child()

parent()
_4

Membawa pergi

  • Kelas juga dapat digunakan sebagai dekorator dengan mengimplementasikan metode __call__ dan meneruskan fungsi ke __init__ sebagai argumen

Penggunaan Dekorator di Dunia Nyata

Salah satu penggunaan dekorator dalam Python adalah untuk mengukur waktu eksekusi suatu fungsi
Perhatikan contoh berikut

def parent():
  print("I am the parent function")

  def first_child():
    print("I am the first child function")

  def second_child():
    print("I am the second child function")

  first_child()
  second_child()

parent()
_5

Keluaran

def parent():
  print("I am the parent function")

  def first_child():
    print("I am the first child function")

  def second_child():
    print("I am the second child function")

  first_child()
  second_child()

parent()
_6

Penjelasan

Fungsi wrapper dekorator ukuran menggunakan fungsi waktu dari modul waktu untuk menghitung selisih waktu antara awal dan akhir eksekusi fungsi dan kemudian mencetaknya di konsol

Fungsi mengantuk hanya digunakan sebagai ilustrasi, ia menggunakan fungsi tidur dari modul waktu untuk membekukan eksekusi selama jangka waktu tertentu. Kita dapat mengukur waktu eksekusi fungsi lain dengan cara yang sama

Apa dekorator di Python?

Dekorator menyediakan sintaks sederhana untuk memanggil fungsi tingkat tinggi. Menurut definisi, dekorator adalah fungsi yang mengambil fungsi lain dan memperluas perilaku fungsi terakhir tanpa mengubahnya secara eksplisit .

Apa dekorator dalam Python dengan contoh pertanyaan wawancara?

Ketika kita menyebut kata "dekorator", apa yang terlintas di benak Anda? . Contohnya adalah ketika kita menggantung bingkai foto ke dinding untuk mempercantik ruangan. Dekorator dengan Python menambahkan beberapa fitur atau fungsionalitas ke fungsi yang sudah ada tanpa mengubahnya .

Apa dekorator di Python dengan contoh w3schools?

Dekorator dalam metaprogramming Python adalah bentuk tertentu dari fungsi yang mengambil fungsi sebagai input dan mengembalikan fungsi baru sebagai output . Ada beberapa dekorator bawaan yaitu. @metodekelas. @metode statis.