成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

Python Decorator的設(shè)計(jì)模式演繹過程解析

89542767 / 450人閱讀

  小編寫這篇文章的一個(gè)主要目的,主要是給大家去做一個(gè)相關(guān)的解答,解答的內(nèi)容主要是涉及到python一些相關(guān)事宜,主要是給大家詳解的是Python Decorator的一些相關(guān)事宜,比如講一下他們的底層原理,關(guān)于設(shè)計(jì)模式演繹過程,下面就給大家詳細(xì)解答下。


  關(guān)于代理模式、裝飾模式


  設(shè)計(jì)模式中經(jīng)常提到的代理模式、裝飾模式,這兩種叫法實(shí)際上是說的同一件事,只是側(cè)重點(diǎn)有所不同而已。


  這兩者都是通過在原有對(duì)象的基礎(chǔ)上封裝一層對(duì)象,通過調(diào)用封裝后的對(duì)象而不是原來的對(duì)象來實(shí)現(xiàn)代理/裝飾的目的。


  例如:(以Java為例)


  public class CountProxy implements Count{
  private CountImpl countImpl;
  public CountProxy(CountImpl countImpl){
  this.countImpl=countImpl;
  }
  Override
  public void queryCount(){
  System.out.println("事務(wù)處理之前");
  //調(diào)用委托類的方法;
  countImpl.queryCount();
  System.out.println("事務(wù)處理之后");
  }
  Override
  public void updateCount(){
  System.out.println("事務(wù)處理之前");
  //調(diào)用委托類的方法;
  countImpl.updateCount();
  System.out.println("事務(wù)處理之后");
  }
  }


  在這個(gè)例子中CountProxy是對(duì)CountImpl的封裝。


  使用者通過CountProxy.queryCount方法來調(diào)用CountImpl.queryCount方法,這被稱為代理,即CountProxy是代理類,CountImpl是被代理類。


  在CountProxy.queryCount方法中,可以在CountImpl.queryCount方法調(diào)用之前和之后添加一些額外的操作,被稱為裝飾,即CountProxy是裝飾類,CountImpl是被裝飾類。


  如果強(qiáng)調(diào)通過CountProxy對(duì)CountImpl進(jìn)行代理的作用,則稱為代理模式;


  如果強(qiáng)調(diào)通過CountProxy對(duì)CountImpl增加額外的操作,則稱為裝飾模式;


  不論是哪種稱呼,其本質(zhì)都在于對(duì)原有對(duì)象的封裝。


  其封裝的目的在于增強(qiáng)所封裝對(duì)象的功能或管理所封裝的對(duì)象。


  從上面的例子也可以發(fā)現(xiàn),代理/封裝所圍繞的核心是可調(diào)用對(duì)象(比如函數(shù))。


  Python中的代理/裝飾


  Python中的可調(diào)用對(duì)象包括函數(shù)、方法、實(shí)現(xiàn)了__call__方法的類。


  Python中的函數(shù)也是對(duì)象,可以作為高階函數(shù)的參數(shù)傳入或返回值返回。


  因此,當(dāng)代理/裝飾的對(duì)象是函數(shù)時(shí),可以使用高階函數(shù)來對(duì)某個(gè)函數(shù)進(jìn)行封裝。


  例如:


  def query_count_proxy(fun,name,age):
  print('do something before')
  rv=fun(name,age)
  print('do something after')
  return rv
  def query_count(name,age):
  print('name is%s,age is%d'%(name,age))
  query_count_proxy(query_count,'Lee',20)


  但是,這個(gè)例子中,query_count函數(shù)作為參數(shù)傳入query_count_proxy函數(shù)中,并在query_count_proxy函數(shù)中被調(diào)用,其結(jié)果作為返回值返回。這就完成了代理的功能,同時(shí),在調(diào)用query_count函數(shù)的前后,我們還增加了裝飾代碼。


  但是,query_count_proxy的函數(shù)參數(shù)與query_count不一樣了,理想的代理應(yīng)該保持接口一致才對(duì)。


  為了保持一致,我們可以利用高階函數(shù)可以返回函數(shù)的特點(diǎn)來完成:


  def query_count_proxy(fun):
  def wrapper(name,age):
  print('do something before')
  rv=fun(name,age)
  print('do something after')
  return rv
  return wrapper
  def query_count(name,age):
  print('name is%s,age is%d'%(name,age))
  query_count_proxy(query_count)('Lee',20)


  修改后的例子,query_count_proxy僅負(fù)責(zé)接受被代理的函數(shù)query_count作為參數(shù),同時(shí),返回一個(gè)函數(shù)對(duì)象wrapper作為返回值,真正的封裝動(dòng)作在wrapper這個(gè)函數(shù)中完成。


  此時(shí),如果調(diào)用query_count_proxy(query_count)就得到了wrapper函數(shù)對(duì)象,則,執(zhí)行query_count_proxy(query_count)('Lee',20)就相當(dāng)于執(zhí)行了wrapper('Lee',20)。


  但是可以看到,query_count_proxy(query_count)('Lee',20)這種使用方法,仍然不能保證一致。


  為了保持一致,我們需要利用Python中對(duì)象與其名稱可以動(dòng)態(tài)綁定的特點(diǎn)。不使用query_count_proxy(quer_count)('Lee',20)來調(diào)用代理函數(shù),而是使用下面兩句:


  1


  2


  query_count=query_count_proxy(query_count)
  query_count('Lee',20)


  執(zhí)行query_count_proxy(query_count)生成wrapper函數(shù)對(duì)象,將這個(gè)對(duì)象通過query_count=query_count_proxy(query_count)綁定到query_count這個(gè)名字上來,這樣執(zhí)行query_count('Lee',20)時(shí),其實(shí)執(zhí)行的是wrapper('Lee',20)。


  這么做的結(jié)果就是:使用代理時(shí)調(diào)用query_count('Lee',20)與不使用代理時(shí)調(diào)用query_count('Lee',20)對(duì)使用者而言保持不變,不用改變代碼,但是在真正執(zhí)行時(shí),使用的是代理/裝飾后的函數(shù)。


  這里,基本利用Python的高階函數(shù)及名稱綁定完成了代理/裝飾的功能。


  還有什么不理想的地方呢?


  對(duì),就是query_count=query_count_proxy(query_count),因?yàn)檫@句既不簡(jiǎn)潔,又屬于重復(fù)工作。


  Python為我們提供了語法糖來完成這類的tedious work。


  方法就是:


  query_count_proxy
  def query_count(name,age):
  return'name is%s,age is%d'%(name,age)
  query_count=query_count_proxy(query_count)就等同于在定義query_count函數(shù)的時(shí)候,在其前面加上query_count_proxy。


  Python看到這樣的語法,就會(huì)自動(dòng)的執(zhí)行query_count=query_count_proxy(query_count)進(jìn)行name rebinding


  補(bǔ)充


  以上就是Python實(shí)現(xiàn)可調(diào)用對(duì)象裝飾的核心。


  可調(diào)用對(duì)象包括函數(shù)、方法、實(shí)現(xiàn)了__call__方法的類,上述內(nèi)容只是針對(duì)函數(shù)來解釋,對(duì)于方法、實(shí)現(xiàn)了__call__方法的類,其基本原理相同,具體實(shí)現(xiàn)略有差別。


  以上就是小編為大家總結(jié)的,希望可以給各位讀者帶來幫助。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/128314.html

相關(guān)文章

  • Python單例模式

    摘要:在中,我們可以用多種方法來實(shí)現(xiàn)單例模式使用模塊使用使用裝飾器使用元類使用模塊其實(shí),的模塊就是天然的單例模式,因?yàn)槟K在第一次導(dǎo)入時(shí),會(huì)生成文件,當(dāng)?shù)诙螌?dǎo)入時(shí),就會(huì)直接加載文件,而不會(huì)再次執(zhí)行模塊代碼。 單例模式 單例模式(Singleton Pattern)是一種常用的軟件設(shè)計(jì)模式,該模式的主要目的是確保某一個(gè)類只有一個(gè)實(shí)例存在。當(dāng)你希望在整個(gè)系統(tǒng)中,某個(gè)類只能出現(xiàn)一個(gè)實(shí)例時(shí),單例對(duì)...

    khlbat 評(píng)論0 收藏0
  • Python: 會(huì)打扮裝飾器

    摘要:一般情況下,我們使用裝飾器提供的語法糖,來簡(jiǎn)化上面的寫法像上面的情況,可以動(dòng)態(tài)修改函數(shù)或類功能的函數(shù)就是裝飾器。本文標(biāo)題為會(huì)打扮的裝飾器本文鏈接為參考資料修飾器的函數(shù)式編程中的裝飾器介紹思誠(chéng)之道裝飾器入門與提高賴明星 裝飾器 我們知道,在 Python 中,我們可以像使用變量一樣使用函數(shù): 函數(shù)可以被賦值給其他變量 函數(shù)可以被刪除 可以在函數(shù)里面再定義函數(shù) 函數(shù)可以作為參數(shù)傳遞給另外...

    blastz 評(píng)論0 收藏0
  • Python函數(shù)修飾器---當(dāng)方法前遇到@參數(shù)化修飾器方法時(shí)發(fā)生

    一、前提概念   Python中的函數(shù)是對(duì)象。也因此,函數(shù)可以被當(dāng)做變量使用。 二、代碼模型 以下代碼片段來自于: http://www.sharejs.com/codes/python/8361 # -*- coding: utf-8 -*- from threading import Thread import time class TimeoutEx...

    huashiou 評(píng)論0 收藏0
  • Python裝飾器vs裝飾器模式

    摘要:希望引以為戒鄭傳裝飾模式如果你了解,你肯定聽過裝飾器模式。在面向?qū)ο笾?,裝飾模式指動(dòng)態(tài)地給一個(gè)對(duì)象添加一些額外的職責(zé)。就增加一些功能來說,裝飾模式比生成子類更為靈活。 漫談 如果作為一個(gè)Python入門,不了解Python裝飾器也沒什么,但是如果作為一個(gè)中級(jí)Python開發(fā)人員,如果再不對(duì)python裝飾器熟稔于心的話,那么可能并沒有量變積累到質(zhì)變。 我以前也看過很多講python 裝...

    stackvoid 評(píng)論0 收藏0
  • Python知識(shí)點(diǎn):理解和使用裝飾器 @decorator

    摘要:使用類裝飾器,優(yōu)點(diǎn)是靈活性大,高內(nèi)聚,封裝性。不過不用擔(dān)心,有,本身也是一個(gè)裝飾器,它的作用就是把原函數(shù)的元信息拷貝到裝飾器函數(shù)中,使得裝飾器函數(shù)也有和原函數(shù)一樣的元信息。 showImg(https://segmentfault.com/img/bVbrFWb?w=742&h=484);Python的裝飾器(decorator)是一個(gè)很棒的機(jī)制,也是熟練運(yùn)用Python的必殺技之一。...

    cyqian 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<