Get started learning Python with DataCamp's free Intro to Python tutorial. Learn Data Science by completing interactive coding challenges and watching videos by expert instructors. Start Now!

This site is generously supported by DataCamp. DataCamp offers online interactive Python Tutorials for Data Science. Join 11 million other learners and get started learning Python for data science today!

Good news! You can save 25% off your Datacamp annual subscription with the code LEARNPYTHON23ALE25 - Click here to redeem your discount

Penghias


Pelekat membolehkan anda membuat pengubahsuaian ringkas pada objek boleh panggil seperti functions, methods, atau classes. Kita akan berurusan dengan fungsi untuk tutorial ini. Sintaks

@decorator
def functions(arg):
    return "value"

Adalah bersamaan dengan:

def function(arg):
    return "value"
function = decorator(function) # ini menghantar fungsi kepada decorator, dan menugaskannya semula kepada functions

Seperti yang anda mungkin lihat, pelekat hanyalah fungsi lain yang mengambil fungsi dan mengembalikannya. Contohnya anda boleh buat ini:

def repeater(old_function):
    def new_function(*args, **kwds): # Lihat learnpython.org/en/Multiple%20Function%20Arguments untuk bagaimana *args dan **kwds berfungsi
        old_function(*args, **kwds) # kita jalankan fungsi lama
        old_function(*args, **kwds) # kita lakukannya dua kali
    return new_function # kita perlu kembalikan new_function, atau ia tidak akan menugaskannya semula kepada nilai

Ini akan membuat fungsi ulang dua kali.

>>> @repeater
def multiply(num1, num2):
    print(num1 * num2)

>>> multiply(2, 3)
6
6

Anda juga boleh mengubah output

def double_out(old_function):
    def new_function(*args, **kwds):
        return 2 * old_function(*args, **kwds) # ubah nilai pulangan
    return new_function

ubah input

def double_Ii(old_function):
    def new_function(arg): # hanya berfungsi jika fungsi lama mempunyai satu argumen
        return old_function(arg * 2) # ubah argumen yang dihantar
    return new_function

dan lakukan pemeriksaan.

def check(old_function):
    def new_function(arg):
        if arg < 0: raise (ValueError, "Negative Argument") # Ini menyebabkan ralat, yang lebih baik daripada melakukan perkara yang salah
        old_function(arg)
    return new_function

Katakan anda mahu darabkan output dengan jumlah pemboleh ubah. Anda boleh definisikan pelekat tersebut dan gunakannya seperti berikut:

def multiply(multiplier):
    def multiply_generator(old_function):
        def new_function(*args, **kwds):
            return multiplier * old_function(*args, **kwds)
        return new_function
    return multiply_generator # ia mengembalikan penjana baru

# Penggunaan
@multiply(3) # multiply bukan penjana, tetapi multiply(3) adalah
def return_num(num):
    return num

# Sekarang return_num adalah dihias dan ditugaskan semula kepada dirinya sendiri
return_num(5) # harus mengembalikan 15

Anda boleh melakukan apa sahaja yang anda mahu dengan fungsi lama, bahkan mengabaikannya sepenuhnya! Pelekat maju juga boleh memanipulasi string doc dan bilangan argumen. Untuk beberapa pelekat menarik, pergi ke http://wiki.python.org/moin/PythonDecoratorLibrary.

Exercise

Buat kilang pelekat yang mengembalikan pelekat yang menghias fungsi dengan satu argumen. Kilang itu harus mengambil satu argumen, iaitu satu jenis, dan kemudian mengembalikan pelekat yang membuat fungsi harus memeriksa jika inputnya adalah jenis yang betul. Jika salah, ia harus mencetak("Bad Type") (Dalam kenyataannya, ia harus menimbulkan ralat, tetapi timbulkan kesilapan tidak ada dalam tutorial ini). Lihatlah kod tutorial dan jangkaan output untuk melihat apa ia jika anda keliru (Saya tahu saya pasti akan keliru). Menggunakan isinstance(object, type_of_object) atau type(object) mungkin membantu.

def type_check(correct_type): #put code here @type_check(int) def times2(num): return num*2 print(times2(2)) times2('Not A Number') @type_check(str) def first_letter(word): return word[0] print(first_letter('Hello World')) first_letter(['Not', 'A', 'String']) def type_check(correct_type): def check(old_function): def new_function(arg): if (isinstance(arg, correct_type)): return old_function(arg) else: print("Bad Type") return new_function return check @type_check(int) def times2(num): return num*2 print(times2(2)) times2('Not A Number') @type_check(str) def first_letter(word): return word[0] print(first_letter('Hello World')) first_letter(['Not', 'A', 'String']) test_output_contains("4") test_output_contains("Bad Type") test_output_contains("H") test_output_contains("Bad Type") success_msg("Good job!")

This site is generously supported by DataCamp. DataCamp offers online interactive Python Tutorials for Data Science. Join over a million other learners and get started learning Python for data science today!

Previous Tutorial Next Tutorial Take the Test
Copyright © learnpython.org. Read our Terms of Use and Privacy Policy