Penghias

Dalam artikel sebelumnya, kami mempelajari tentang penutupan dengan menyelesaikan masalah keperluan Artikel ini akan melakukan perkara yang sama, dengan perlahan-lahan mengembangkan keperluan dan memahami penghias Python langkah demi langkah.

Pertama sekali, terdapat fungsi sedemikian yang mengeluarkan maklumat punch-in pekerja:

def punch():
    print('昵称:两点水  部门:做鸭事业部 上班打卡成功')
punch()

Hasil output adalah seperti berikut:

昵称:两点水  部门:做鸭事业部 上班打卡成功

Kemudian, maklum balas produk, tidak, mengapa jam masuk tidak mempunyai tarikh tertentu ? Tambah tarikh tertentu penebuk masuk, ini sepatutnya Ia sangat mudah dan boleh diselesaikan dalam beberapa minit. Okay, kemudian tambah kod untuk mencetak tarikh, seperti berikut:

import time
def punch():
    print(time.strftime('%Y-%m-%d', time.localtime(time.time())))
    print('昵称:两点水  部门:做鸭事业部 上班打卡成功')
punch()

Hasil output adalah seperti berikut:

2018-01-09
昵称:两点水  部门:做鸭事业部 上班打卡成功

Tidak mengapa untuk menukarnya seperti ini, tetapi ia mengubah struktur fungsi fungsi ini ditakrifkan, ia mencetak maklumat dan gesaan pekerja telah berjaya dimasukkan. Sekarang menambahkan kod untuk mencetak tarikh boleh menyebabkan banyak masalah pertindihan kod. Sebagai contoh, terdapat tempat lain yang hanya perlu mencetak maklumat pekerja dan menumbuk masuk dengan jayanya, tetapi tiada tarikh diperlukan Jadi adakah anda perlu menulis semula fungsi? Selain itu, kaedah berfungsi mencetak tarikh semasa ini kerap digunakan dan boleh dipanggil sebagai fungsi awam untuk setiap kaedah modul. Sudah tentu, ini semua dianggap sebagai projek keseluruhan.

Memandangkan ini berlaku, kami boleh menggunakan pengaturcaraan berfungsi untuk mengubah suai bahagian kod ini. Kerana melalui kajian terdahulu, kita tahu bahawa fungsi Python mempunyai dua ciri Fungsi A juga merupakan objek, dan fungsi boleh bersarang dalam fungsi Kemudian ubah suai kod untuk kelihatan seperti ini:

import time
def punch():
    print('昵称:两点水  部门:做鸭事业部 上班打卡成功')
def add_time(func):
    print(time.strftime('%Y-%m-%d', time.localtime(time.time())))
    func()
add_time(punch)

Hasil keluaran:

2018-01-09
昵称:两点水  部门:做鸭事业部 上班打卡成功

Bukan. ini betul? Saya dapati dengan cara ini, kaedah punch tidak diubah, dan mana-mana fungsi yang perlu mencetak tarikh semasa hanya boleh menghantar fungsi ke dalam add_time, seperti ini:

import time
def punch():
    print('昵称:两点水  部门:做鸭事业部 上班打卡成功')
def add_time(func):
    print(time.strftime('%Y-%m-%d', time.localtime(time.time())))
    func()
def holiday():
    print('天气太冷,今天放假')
add_time(punch)
add_time(holiday)

Cetak hasil:

2018-01-09
昵称:两点水  部门:做鸭事业部 上班打卡成功
2018-01-09
天气太冷,今天放假

Adakah mudah untuk menggunakan pengaturcaraan fungsi, tetapi setiap kali kita memanggilnya, kita perlu lulus fungsi asal sebagai parameter Adakah terdapat cara yang lebih baik untuk melaksanakannya? Ya, penghias yang akan saya perkenalkan dalam artikel ini, kerana cara menulis penghias sebenarnya serupa dengan penutupan, tetapi tiada pembolehubah bebas, jadi inilah cara untuk menulis penghias dalam kod di atas untuk perbandingan. Apakah perbezaan antara penulisan dan pengaturcaraan berfungsi?

import time
def decorator(func):
    def punch():
        print(time.strftime('%Y-%m-%d', time.localtime(time.time())))
        func()
    return punch
def punch():
    print('昵称:两点水  部门:做鸭事业部 上班打卡成功')
f = decorator(punch)
f()

Hasil keluaran:

2018-01-09
昵称:两点水  部门:做鸭事业部 上班打卡成功

Melalui kod, anda boleh tahu bahawa fungsi penghias secara amnya melakukan tiga perkara ini:

Menerima fungsi sebagai parameter

Menyarang fungsi pembungkus, dan fungsi pembungkus akan menerima parameter yang sama daripada fungsi asal, Dan laksanakan fungsi asal, dan juga laksanakan fungsi tambahan

Kembalikan fungsi bersarang

Namun, jika anda melihat kod ini dengan teliti, mengapakah cara menulis penghias ini lebih menyusahkan daripada pengaturcaraan berfungsi? Dan ia kelihatan rumit, walaupun agak tidak perlu.

Itu kerana kami belum menggunakan "gula sintaks" penghias lagi. Melihat pada kod di atas, kami dapat melihat bahawa apabila Python memperkenalkan penghias (Decorator), ia tidak memperkenalkan sebarang ciri sintaks baharu pada sintaks fungsi. Ini juga menunjukkan bahawa penghias bukan unik untuk Python, tetapi idea pengaturcaraan biasa untuk setiap bahasa. Cuma Python telah mereka @ gula sintaks, yang menjadikan proses mentakrifkan penghias, memanggil penghias fungsi asal dan memberikan hasilnya kepada nama objek fungsi asal lebih mudah, lebih mudah, dan lebih mudah untuk dikendalikan, jadi teras daripada tin penghias Python Mengatakan ia adalah gula sintaksisnya.

Jadi bagaimana untuk menggunakan gula sintaksisnya? Ia sangat mudah selepas menulis fungsi penghias mengikut kaedah penulisan di atas, terus tambah @ dan nama fungsi penghias kepada fungsi asal. Seperti berikut:

import time
def decorator(func):
    def punch():
        print(time.strftime('%Y-%m-%d', time.localtime(time.time())))
        func()
    return punch
@decorator
def punch():
    print('昵称:两点水  部门:做鸭事业部 上班打卡成功')
punch()

Hasil keluaran:

2018-01-09
昵称:两点水  部门:做鸭事业部 上班打卡成功

Maka ini sangat sesuai untuk panggilan kita Sebagai contoh, selepas menggunakan penghias, kita boleh terus menambah gula sintaks kepada fungsi asal itu, tiada perubahan pada fungsi ini, dan tempat panggilan tidak perlu diubah suai.

Walau bagaimanapun, selalu ada masalah di sini, iaitu, output maklumat punch-in telah ditetapkan, jadi kita perlu meneruskannya melalui parameter Bagaimana untuk menulis penghias? Fungsi dalam penghias boleh menggunakan parameter pembolehubah *args, tetapi hanya menggunakan *args tidak boleh memasukkan sepenuhnya semua parameter Sebagai contoh, parameter kata kunci tidak boleh digunakan untuk serasi dengan parameter kata kunci, kita juga perlu menambah **kwargs .

Oleh itu, bentuk akhir penghias boleh ditulis seperti ini:

import time
def decorator(func):
    def punch(*args, **kwargs):
        print(time.strftime('%Y-%m-%d', time.localtime(time.time())))
        func(*args, **kwargs)
    return punch
@decorator
def punch(name, department):
    print('昵称:{0}  部门:{1} 上班打卡成功'.format(name, department))
@decorator
def print_args(reason, **kwargs):
    print(reason)
    print(kwargs)
punch('两点水', '做鸭事业部')
print_args('两点水', sex='男', age=99)

Hasil keluarannya adalah seperti berikut:

2018-01-09
昵称:两点水  部门:做鸭事业部 上班打卡成功
2018-01-09
两点水
{'sex': '男', 'age': 99}

Ini adalah penghujung siri artikel tentang bermula dengan Python.


Meneruskan pembelajaran
  • Cadangan kursus
  • Muat turun perisian kursus
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!