日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python —— 装饰器

發布時間:2025/3/21 python 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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__方法,
  • 當使用@形式將裝飾器附加到函數上時,就會調用此方法
class decorate_process_cls(object):def __init__(self,func):self.func = funcdef __call__(self,*args,**kargs):print("%s函數開始運行"%self.func.__name__)self.func(*args,**kargs)print("%s函數運行結束"%self.func.__name__)@decorate_process_cls def wj_mean(a,b):print((a+b)/2)wj_mean(2,5)

4、functools.wraps

  • 使用裝飾器極大地復用了代碼,但是它有一個缺點就是原函數的元信息不見了;
  • 這個問題就比較嚴重,好在我們有functools.wraps,wraps本身也是一個裝飾器;
  • 它能把原函數的元信息拷貝到裝飾器函數中,這使得裝飾函數也也有和原函數一樣的元信息。
from functools import wraps import datetimeclass decorator_process_cls2(object):def __init__(self,func):self.func = funcdef __call__(self,*args,**kargs):"""這是一個裝飾器"""print(datetime.datetime.now(),"%s程序開始運行"%self.func.__name__)self.func(*args,**kargs)print(datetime.datetime.now(),"%s程序結束運行"%self.func.__name__)@decorator_process_cls2 def wj_multiply(a,b):"""這是原函數"""print(a*b)print(dir(wj_multiply))class decorator_process_cls2(object):def __init__(self,func):self.func = func@wrapsdef __call__(self,*args,**kargs):"""這是一個裝飾器"""print(datetime.datetime.now(),"%s程序開始運行"%self.func.__name__)self.func(*args,**kargs)print(datetime.datetime.now(),"%s程序結束運行"%self.func.__name__)@decorator_process_cls2 def wj_multiply(a,b):"""這是原函數"""print(a*b)print(dir(wj_multiply))

5、內置裝飾器

  • @classmethod
  • @staticmethod
  • @property

5.1 @classmethod

  • 我們要寫一個實例不能調用,而能用類調用的方法,則可添加@classmethod的裝飾器
  • 此時函數不需要傳self這個參數,但是需要傳類這個對象作為參數
class wj_1(object):name = "張三"age = 18@classmethoddef infor(class_object):print(class_object.name,"的年齡是",class_object.age,"歲",sep = "")wj_1.infor()

5.2 @staticmethod

  • 經常有一些跟類有關系的功能,但在運行時又不需要實例和類參與的情況下,
  • 需要用到靜態方法,比如更改環境變量或者修改其它類的屬性等能用到靜態方法,
  • 實例或者類都能調用該方法
class wj_2(object):def __init__(self):self.name_ = "李四"self.age_ = 25name = "張三"age = 18@staticmethoddef update_name():wj_2.name = "王二" print(wj_2.name) wj_2.update_name() print(wj_2.name)
  • 1、@staticmethod 不需要表示自身對象的self參數,也不需要表示自身類的參數class_object,就和使用函數一樣
  • 2、@classmethod不需要self,但是需要class_object
class wj_ensemble(object):sign = "a處"def __init__(self):self.sign = "b處"@classmethoddef func_class(class_obj):print(class_obj.sign)@staticmethoddef func_static():print(wj_ensemble.sign)def func_usual(self):print(self.sign) # 實例運行普通類函數 wj_ensemble().func_usual() # 類運行普通類函數 try:wj_ensemble.func_usual except Exception as error:print("類不能調用普通函數") # 類調用@classmethod裝飾的方法 wj_ensemble.func_class()# 實例不能調用@classmethod裝飾的方法 wj_ensemble().func_class()# 靜態函數都可以調用 wj_ensemble.func_static() wj_ensemble().func_static()

5.3 @property

使用此裝飾器以后,實例可以把方法當屬性來調用,也就是無法對屬性賦值使用,@property最主要的目的是使得對私有屬性無法修改

class wj_3(object):def __init__(self):self.__name__ = "玫瑰少年"@propertydef name(self):return self.__name__ wj_3().name

6、屬性的分類

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、雙下劃線開頭,不可用實例來更改
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的python —— 装饰器的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。