python裝飾器的使用

2021-10-11 21:32:17 字數 2534 閱讀 4053

它可以使我們的**看起來更簡潔,可以修改部分函式功能,讓你的**看起來很「高階」,當然,它也可能會造成**的閱讀性變差,所以在使用裝飾器的時候,你需要做乙個取捨。

首先來看一段**:

def param_func():

return "hi, im a function"

def decoration(function):

print("hi, im a decoration")

print(function)

decoration(param_func)

def name():

print("hi, im zhangsan")

def decoration(name):

def set_***_age():

print("hi, im a boy")

name()

print("hi, im 16 years old")

return set_***_age

name = decoration(name)

name()

上面這段**描述的就是函式裝飾器所作的事情,它封裝乙個函式且修改其行為,現在,我們換成使用@符號來修改上面這段**:

def decoration(name):

def set_***_age():

print("hi, im a boy")

name()

print("hi, im 16 years old")

return set_***_age

@decoration

def name():

print("hi, im zhangsan")

name()

這裡存在了乙個問題,如果你列印name.__name__,就會發現輸出是set_***_age,函式名字被重寫了,因此可以使用下面的方式來解決:

from functools import wraps

def decoration(name):

@wraps(name)

def set_***_age():

print("hi, im a boy")

name()

print("hi, im 16 years old")

return set_***_age

@decoration

def name():

print("hi, im zhangsan")

name()

print(name.__name__)

同樣,使用裝飾器也可以帶引數,它的好處就不用說明了:

from functools import wraps

def people_decoration(age=16):

def decoration(name):

@wraps(name)

def set_***_age():

print("hi, im a boy")

name()

print(f"hi, im years old")

return set_***_age

return decoration

@people_decoration(age=18)

def zhangsan():

print("hi, im zhangsan")

@people_decoration()

def lisi():

print("hi, im lisi")

zhangsan()

lisi()

裝飾器類的好處之一就是可以被繼承:

from functools import wraps

class people_decoration(object):

def __init__(self, ***='boy', age='16'):

self.*** = ***

self.age = age

def __call__(self, name):

@wraps(name)

def decoration(*args, **kwargs):

print(f"hi, im a ")

name()

print(f"hi, im years old")

return decoration

@people_decoration()

def zhangsan():

print("hi, im zhangsan")

@people_decoration(***="girl", age="18")

def lisi():

print("hi, im lisi")

zhangsan()

lisi()

其中用到了__call__,可以簡單理解為__call__()過載了(),使得類的例項物件可以直接像呼叫普通函式那樣直接呼叫:物件名()

python 裝飾器的使用

使用裝飾器將函式作為引數,最後再返回乙個引數,簡單來說就是在不修改原函式的 上對原函式新增新的功能。1 在原函式中新增乙個裝飾器 原函式 def sayhello print hello,world sayhello 新增裝飾器後 import functools def decorator fun...

python裝飾器的使用

在class內部,可以有屬性和方法,而外部 可以通過直接呼叫例項變數的方法來運算元據,這樣,就隱藏了內部的複雜邏輯。但是,從前面student類的定義來看,外部 還是可以自由地修改乙個例項的name score屬性 如果要讓內部屬性不被外部訪問,可以把屬性的名稱前加上兩個下劃線 在python中,例...

Python裝飾器的使用

本文介紹的是python裝飾器 的使用,分三部分記錄裝飾器,旨在為之後複習保留學習筆記。python裝飾器在沒有改變原始函式呼叫方式的同時,在原始函式的前後增加功能,滿足開放封閉原則。目錄 1.裝飾器的固定模板 2.帶引數的裝飾器模板 3.多個裝飾器函式裝飾乙個函式 裝飾器的固定模板 def inn...