python —— 装饰器
生活随笔
收集整理的這篇文章主要介紹了
python —— 装饰器
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
python —— 裝飾器
- 1、裝飾器簡介
- 2、簡單裝飾器
- 3、帶參數的裝飾器
- 3、類裝飾器
- 4、functools.wraps
- 5、內置裝飾器
- 5.1 @classmethod
- 5.2 @staticmethod
- 5.3 @property
- 6、屬性的分類
- 6.1 實例的屬性
- 6.2 類屬性
- 6.3 類屬性
1、裝飾器簡介
- 1、函數也是一個對象,而且函數對象也可以被賦值給變量,所以通過變量也能調用該函數
- 2、函數對象有一個__name__屬性,可以拿到函數的名字
- 3、裝飾器的作用就是為已經存在的對象添加額外的功能
- 4、裝飾器是在定義函數和類的時候使用
2、簡單裝飾器
實現我們在跑程序的時候告訴我們運行進度
def decorator_process(func):def wrapper(*args,**kargs):print("%s已經開始運行"%func.__name__)return func(*args,**kargs)return wrapper@decorator_process def wj_sum(a,b):print(a+b)-7 wj_sum(5,6)3、帶參數的裝飾器
裝飾器允許我們在調用時提供給它參數
def decorator_user(user):def decorator(func):def wrapper(*args,**kargs):print("%s在使用%s函數"%(user,func.__name__))return func(*args,**kargs)return wrapperreturn decorator@decorator_user("wj") def wj_average(a,b):print((a+b)/2)wj_average(2,5)3、類裝飾器
- 相比于函數裝飾器,裝飾器具有靈活度大、高內聚、封裝性等優點,
- 使用類裝飾器還可以依靠內部的__recall__方法,
- 當使用@形式將裝飾器附加到函數上時,就會調用此方法
4、functools.wraps
- 使用裝飾器極大地復用了代碼,但是它有一個缺點就是原函數的元信息不見了;
- 這個問題就比較嚴重,好在我們有functools.wraps,wraps本身也是一個裝飾器;
- 它能把原函數的元信息拷貝到裝飾器函數中,這使得裝飾函數也也有和原函數一樣的元信息。
5、內置裝飾器
- @classmethod
- @staticmethod
- @property
5.1 @classmethod
- 我們要寫一個實例不能調用,而能用類調用的方法,則可添加@classmethod的裝飾器
- 此時函數不需要傳self這個參數,但是需要傳類這個對象作為參數
5.2 @staticmethod
- 經常有一些跟類有關系的功能,但在運行時又不需要實例和類參與的情況下,
- 需要用到靜態方法,比如更改環境變量或者修改其它類的屬性等能用到靜態方法,
- 實例或者類都能調用該方法
- 1、@staticmethod 不需要表示自身對象的self參數,也不需要表示自身類的參數class_object,就和使用函數一樣
- 2、@classmethod不需要self,但是需要class_object
5.3 @property
使用此裝飾器以后,實例可以把方法當屬性來調用,也就是無法對屬性賦值使用,@property最主要的目的是使得對私有屬性無法修改
class wj_3(object):def __init__(self):self.__name__ = "玫瑰少年"@propertydef name(self):return self.__name__ wj_3().name6、屬性的分類
6.1 實例的屬性
- 1、在def __ init __(self)中初始化
- 2、內部調用使用self.property
- 3、外部調用使用instance.property
6.2 類屬性
- 1、在def __ init __(self)外初始化
- 2、內部調用:classname.property
- 3、外部調用:classname.property 或者 instance.property
6.3 類屬性
- 1、單下劃線開頭,只是告訴別人這是私有屬性,外部依舊可以更改
- 2、雙下劃線開頭,不可用實例來更改
總結
以上是生活随笔為你收集整理的python —— 装饰器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python——json数据
- 下一篇: python——正则表达式