真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

怎么使用Python裝飾器-創(chuàng)新互聯(lián)

這篇文章給大家介紹怎么使用Python裝飾器,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

成都創(chuàng)新互聯(lián)公司自成立以來,一直致力于為企業(yè)提供從網(wǎng)站策劃、網(wǎng)站設(shè)計、成都網(wǎng)站建設(shè)、成都網(wǎng)站制作、電子商務(wù)、網(wǎng)站推廣、網(wǎng)站優(yōu)化到為企業(yè)提供個性化軟件開發(fā)等基于互聯(lián)網(wǎng)的全面整合營銷服務(wù)。公司擁有豐富的網(wǎng)站建設(shè)和互聯(lián)網(wǎng)應(yīng)用系統(tǒng)開發(fā)管理經(jīng)驗、成熟的應(yīng)用系統(tǒng)解決方案、優(yōu)秀的網(wǎng)站開發(fā)工程師團(tuán)隊及專業(yè)的網(wǎng)站設(shè)計師團(tuán)隊。

什么是裝飾器

裝飾是為函數(shù)和類指定管理代碼的一種方式。Python裝飾器以兩種形式呈現(xiàn):

【1】函數(shù)裝飾器在函數(shù)定義的時候進(jìn)行名稱重綁定,提供一個邏輯層來管理函數(shù)和方法或隨后對它們的調(diào)用。
【2】類裝飾器在類定義的時候進(jìn)行名稱重綁定,提供一個邏輯層來管理類,或管理隨后調(diào)用它們所創(chuàng)建的實(shí)例。

簡而言之,裝飾器提供了一種方法,在函數(shù)和類定義語句的末尾插入自動運(yùn)行的代碼——對于函數(shù)裝飾器,在def的末尾;對于類裝飾器,在class的末尾。這樣的代碼可以扮演不同的角色。

裝飾器提供了一些和代碼維護(hù)性和審美相關(guān)的有點(diǎn)。此外,作為結(jié)構(gòu)化工具,裝飾器自然地促進(jìn)了代碼封裝,這減少了冗余性并使得未來變得更容易。

函數(shù)裝飾器

通過在一個函數(shù)的def語句的末尾運(yùn)行另一個函數(shù),把最初的函數(shù)名重新綁定到結(jié)果。

用法

裝飾器在緊挨著定義一個函數(shù)或方法的def語句之前的一行編寫,并且它由@符號以及緊隨其后的對于元函數(shù)的一個引用組成——這是管理另一個函數(shù)的一個函數(shù)(或其他可調(diào)用對象)。

在編碼上,函數(shù)裝飾器自動將如下語法:

@decorator
def F(arg):
  ...
F(99)

映射為這個對等形式:

def F(arg):
  ...
F = decorator(F)
F(99)

這里的裝飾器是一個單參數(shù)的可調(diào)用對象,它返回與F具有相同數(shù)目的參數(shù)的一個可調(diào)用對象。

當(dāng)隨后調(diào)用F函數(shù)的時候,它自動調(diào)用裝飾器所返回的對象。

換句話說,裝飾實(shí)際把如下的第一行映射為第二行(盡管裝飾器只在裝飾的時候運(yùn)行一次)

fun(6,7)
decorator(func)(6,7)

這一自動名稱重綁定也解釋了之前介紹的靜態(tài)方法和property裝飾器語法的原因:

class C:
  @staticmethod
  def meth(...):...
  @property
  def name(self):...

實(shí)現(xiàn)

裝飾器自身是返回可調(diào)用對象的可調(diào)用對象。實(shí)際上,它可以是任意類型的可調(diào)用對象,并且返回任意類型的可調(diào)用對象:函數(shù)和類的任何組合都可以使用,盡管一些組合更適合于特定的背景。

有一種常用的編碼模式——裝飾器返回了一個包裝器,包裝器把最初的函數(shù)保持到一個封閉的作用域中:

def decorator(F):
  def wrapper(*args):
    # 使用 F 和 *args
    # 調(diào)用原來的F(*args)
  return wrapper
@decorator
def func(x,y):
  ...
func(6,7)

當(dāng)隨后調(diào)用名稱func的時候,它確實(shí)調(diào)用裝飾器所返回的包裝器函數(shù);隨后包裝器函數(shù)可能運(yùn)行最初的func,因為它在一個封閉的作用域中仍然可以使用。

為了對類做同樣的事情,我們可以重載調(diào)用操作:

class decorator:
  def __init__(self,func):
    self.func = func
  def __call__(self,*args):
    # 使用self.func和args
    # self.func(*args)調(diào)用最初的func
@decorator
def func(x,y):
  ...
func(6,7)

但是,要注意的是,基于類的代碼中,它對于攔截簡單函數(shù)有效,但當(dāng)它應(yīng)用于類方法函數(shù)時,并不很有效:

如下反例:

class decorator:
  def __init__(self,func):
    self.func = func
  def __call__(self,*args):
    # 調(diào)用self.func(*args)失敗,因為C實(shí)例參數(shù)無法傳遞
class C:
  @decorator
  def method(self,x,y):
    ...

這時候裝飾的方法重綁定到一個類的方法上,而不是一個簡單的函數(shù),這一點(diǎn)帶來的問題是,當(dāng)裝飾器的方法__call__隨后運(yùn)行的時候,其中的self接受裝飾器類實(shí)例,并且類C的實(shí)例不會包含到一個*args中。

這時候,嵌套函數(shù)的替代方法工作得更好:

def decorator:
  def warpper(*args):
    # ...
  return wrapper
@decorator
def func(x,y):
  ...
func(6,7)
class C:
  @decorator
  def method(self,x,y):
    ...
x = C()
x.method(6,7)

類裝飾器

類裝飾器與函數(shù)裝飾器使用相同的語法和非常相似的編碼方式。類裝飾器是管理類的一種方式,或者用管理或擴(kuò)展類所創(chuàng)建的實(shí)例的額外邏輯,來包裝實(shí)例構(gòu)建調(diào)用。

用法

假設(shè)類裝飾器返回一個可調(diào)用對象的一個單參數(shù)的函數(shù),類裝飾器的語法為:

@decorator
class C:
  ...
x = C(99)

等同于下面的語法:

class C:
  ...
C = decorator(C)
x = C(99)

直接效果是隨后調(diào)用類名會創(chuàng)建一個實(shí)例,該實(shí)例會觸發(fā)裝飾器所返回的可調(diào)用對象,而不是調(diào)用最初的類自身。

實(shí)現(xiàn)

類裝飾器返回的可調(diào)用對象,通常創(chuàng)建并返回最初的類的一個新的實(shí)例,以某種方式來擴(kuò)展對其接口的管理。例如,下面的實(shí)例插入一個對象來攔截一個類實(shí)例的未定義的屬性:

def decorator(cls):
  class Wrapper:
    def __init__(self,*args):
      self.wrapped = cls(*args)
    def __getattr__(self,name):
      return getattr(self.wrapped,name)
  return Wrapper
@decorator
class C:        # C = decorator(C)
  def __init__(self,x,y):    # Run by Wrapper.__init__
    self.attr = 'spam'
x = C(6,7)        # 等價于Wrapper(6,7)
print(x.attr)

在這個例子中,裝飾器把類的名稱重新綁定到另一個類,這個類在一個封閉的作用域中保持了最初的類。

就像函數(shù)裝飾器一樣,類裝飾器通??梢跃帉憺橐粋€創(chuàng)建并返回可調(diào)用對象的“工廠”函數(shù)。

裝飾器嵌套

有時候,一個裝飾器不夠,裝飾器語法允許我們向一個裝飾器的函數(shù)或方法添加包裝器邏輯的多個層。這種形式的裝飾器的語法為:

@A
@B
@C
def f(...):
  ...

如下這樣轉(zhuǎn)換:

def f(...):
  ...
f = A(B(C(f)))

這里,最初的函數(shù)通過3個不同的裝飾器傳遞,每個裝飾器處理前一個結(jié)果。

裝飾器參數(shù)

函數(shù)裝飾器和類裝飾器都能接受參數(shù),如下:

@decorator(A,B)
def F(arg):
  ...
F(99)

自動映射到其對等形式:

def F(arg):
  ...
F = decorator(A,B)(F)
F(99)

裝飾器參數(shù)在裝飾之前就解析了,并且它們通常用來保持狀態(tài)信息供隨后的調(diào)用使用。例如,這個例子中的裝飾器函數(shù),可能采用如下形式:

def decorator(A,B):
  # 保存或使用A和B
  def actualDecorator(F):
    # 保存或使用函數(shù) F
    # 返回一個可調(diào)用對象
    return callable
  return actualDecorator

python可以做什么

Python是一種編程語言,內(nèi)置了許多有效的工具,Python幾乎無所不能,該語言通俗易懂、容易入門、功能強(qiáng)大,在許多領(lǐng)域中都有廣泛的應(yīng)用,例如最熱門的大數(shù)據(jù)分析,人工智能,Web開發(fā)等。

關(guān)于怎么使用Python裝飾器就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。


本文題目:怎么使用Python裝飾器-創(chuàng)新互聯(lián)
文章路徑:http://weahome.cn/article/djidjs.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部