最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python裝飾器原理與用法分析

 更新時(shí)間:2018年04月30日 13:02:52   作者:Tom文星  
這篇文章主要介紹了Python裝飾器原理與用法,結(jié)合實(shí)例形式分析了Python裝飾器的概念、原理、使用方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下

本文實(shí)例講述了Python裝飾器原理與用法。分享給大家供大家參考,具體如下:

1、裝飾器的本質(zhì)是函數(shù),主要用來(lái)裝飾其他函數(shù),也就是為其他函數(shù)添加附加功能

2、裝飾器的原則:

(1) 裝飾器不能修改被裝飾的函數(shù)的源代碼

(2) 裝飾器不能修改被裝飾的函數(shù)的調(diào)用方式

3、實(shí)現(xiàn)裝飾器的知識(shí)儲(chǔ)備

(1) Python中函數(shù)即‘變量'

a、變量在Python中的存儲(chǔ)

x='Tomwenxing'
y=x

[說(shuō)明]:

當(dāng)Python解釋器遇到語(yǔ)句x='Tomwenxing'時(shí),它主要完成了兩樣工作:

  1.在內(nèi)存中開辟了一片空間用來(lái)存儲(chǔ)字符串‘Tomwenxing'

  2.在內(nèi)存從創(chuàng)建了一個(gè)名為x的變量,并用它指向字符串‘Tomwenxing'所占據(jù)的內(nèi)存空間(可以理解為房間和房間號(hào)的關(guān)系)

而語(yǔ)句y=x意為將變量x對(duì)字符串的引用賦值給變量y,即在內(nèi)存中創(chuàng)建一個(gè)變量y,并使其指向變量x所指向的內(nèi)存空間

b、函數(shù)在Python中的存儲(chǔ)

def test():
  pass

[說(shuō)明]:

在Python中,函數(shù)的存儲(chǔ)和變量相似,以上面的函數(shù)為例,Python解釋其主要做兩件事:

  1.在內(nèi)存中開辟一個(gè)內(nèi)存空間,用來(lái)存儲(chǔ)函數(shù)代碼的字符串(本例中代碼只有一句:pass)

  2.在內(nèi)存中創(chuàng)建一個(gè)變量test,用來(lái)指向存儲(chǔ)函數(shù)代碼字符串的內(nèi)存空間(相當(dāng)于test=‘函數(shù)體')

因此說(shuō)在Python中函數(shù)即變量

(2) 高階函數(shù)(下面兩個(gè)條件滿足任何一個(gè)即為高階函數(shù))

a、把一個(gè)函數(shù)名當(dāng)做實(shí)參傳遞給另外一個(gè)函數(shù)

[對(duì)裝飾器的影響]:達(dá)到“在不修改被裝飾函數(shù)源代碼的情況下為其添加功能”的效果

import time
def bar():
  time.sleep(2)
  print('in the bar')
def test(func):
  start_time=time.time()
  func()
  stop_time=time.time()
  print('函數(shù)的運(yùn)行時(shí)間為:',stop_time-start_time)
test(bar)

運(yùn)行結(jié)果:

in the bar
函數(shù)的運(yùn)行時(shí)間為: 2.0021145343780518

b、返回值中包含函數(shù)名

[對(duì)裝飾器的影響]:達(dá)到“不改變函數(shù)的調(diào)用方式“的效果

import time
def bar():
  time.sleep(3)
  print('in the bar')
def test2(func):
  print('新添加的功能')
  return func
bar=test2(bar)
bar()

運(yùn)行結(jié)果:

新添加的功能
in the bar

(3) 嵌套函數(shù):在一個(gè)函數(shù)體內(nèi)用def去聲明一個(gè)新的函數(shù)(不是調(diào)用)

def foo():
  print('in the foo')
  def bar(): #聲明一個(gè)新的函數(shù),而不是調(diào)用函數(shù)
    print('in the bar')
  bar()
foo()

運(yùn)行結(jié)果:

in the foo
in the bar

4、裝飾器的語(yǔ)法:高階函數(shù)+嵌套函數(shù)=》裝飾器 (下面的例子可以用pycharm的調(diào)試器調(diào)試一下,看看代碼的運(yùn)行順序)

import time
def timer(func):
  def deco(*args,**kwargs):#使用了不定參數(shù)
    start_time=time.time()
    res=func(*args,**kwargs) #運(yùn)行函數(shù)
    stop_time=time.time()
    print('運(yùn)行時(shí)間:',stop_time-start_time)
    return res # 若無(wú)返回值,則返回None
  return deco
@timer #等價(jià)于test1=timer(test1)=deco,即test1()=deco()
def test1():
  time.sleep(3)
  print('in the test1')
@timer #等價(jià)于test2=timer(test2)=deco,即test2(name)=deco(name)
def test2(name):
  time.sleep(3)
  print('in the test2',name)
test1()
print('-------------分界線------------------------')
test2('Tomwenxing')

運(yùn)行結(jié)果:

in the test1
運(yùn)行時(shí)間: 3.0001718997955322
-------------分界線------------------------
in the test2 Tomwenxing
運(yùn)行時(shí)間: 3.000171422958374

5、帶參數(shù)的裝飾器

# -*- coding:utf-8 -*-
user,passwd='Tomwenxing','123'
#如裝飾器帶參數(shù),一般是三層嵌套
def auth(auth_type): #第一層的參數(shù)是裝飾器的參數(shù)
  def outer_wrapper(func):#第二層的參數(shù)是裝飾器要裝飾的目標(biāo)函數(shù)
    def wrapper(*args,**kwargs):#第三次的參數(shù)是目標(biāo)函數(shù)的參數(shù)
      if auth_type=='local':
        username = input('Username:').strip()
        password = input('Password:').strip()
        if user == username and passwd == password:
          print('用戶Tomwenxing已經(jīng)成功登錄!')
          res = func(*args, **kwargs) #運(yùn)行目標(biāo)函數(shù)
          return res
        else:
          exit('用戶名或密碼有錯(cuò)誤')
      elif auth_type=='ldap':
        print('暫不支持這種登錄方式!')
    return wrapper
  return outer_wrapper
def index():
  print('歡迎來(lái)到index頁(yè)面')
@auth(auth_type='local') #home=wrapper()
def home(name):
  print('%s,歡迎來(lái)到home頁(yè)面' %name)
  return 'This is home page'
@auth(auth_type='ldap')
def bbs():
  print('歡迎來(lái)到bbs頁(yè)面 ')
index()
print('----------------------分界線-------------------')
print('函數(shù)的返回值為:',home('wenxing'))
print('----------------------分界線-------------------')
bbs()

運(yùn)行結(jié)果:

歡迎來(lái)到index頁(yè)面
----------------------分界線-------------------
Username:Tomwenxing
Password:123
用戶Tomwenxing已經(jīng)成功登錄!
wenxing,歡迎來(lái)到home頁(yè)面
函數(shù)的返回值為: This is home page
----------------------分界線-------------------
暫不支持這種登錄方式!

更多關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python加密解密算法與技巧總結(jié)》、《Python編碼操作技巧總結(jié)》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》及《Python入門與進(jìn)階經(jīng)典教程

希望本文所述對(duì)大家Python程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • Python復(fù)制Excel帶有條件格式的單元格sheet實(shí)現(xiàn)步驟

    Python復(fù)制Excel帶有條件格式的單元格sheet實(shí)現(xiàn)步驟

    這篇文章主要為大家介紹了Python復(fù)制Excel帶有條件格式的單元格sheet實(shí)現(xiàn)步驟,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • Python?提取出SQL語(yǔ)句中Where的值兩種方法(示例代碼)

    Python?提取出SQL語(yǔ)句中Where的值兩種方法(示例代碼)

    為了提取SQL語(yǔ)句中WHERE子句的值,我們可以利用Python的sqlparse庫(kù),這是一個(gè)專門用于解析SQL語(yǔ)句的庫(kù),這篇文章主要介紹了Python?提取出SQL語(yǔ)句中Where的值的方法,需要的朋友可以參考下
    2024-08-08
  • python元組簡(jiǎn)單介紹

    python元組簡(jiǎn)單介紹

    這篇文章主要給大家分享中得python基礎(chǔ) 元組,元組的特點(diǎn)是一種不可變序列,一旦創(chuàng)建就不能修改,帶著些許了解和小編一起進(jìn)入文章得具體內(nèi)容吧
    2021-10-10
  • Django框架登錄加上驗(yàn)證碼校驗(yàn)實(shí)現(xiàn)驗(yàn)證功能示例

    Django框架登錄加上驗(yàn)證碼校驗(yàn)實(shí)現(xiàn)驗(yàn)證功能示例

    這篇文章主要介紹了Django框架登錄加上驗(yàn)證碼校驗(yàn)實(shí)現(xiàn)驗(yàn)證功能,結(jié)合實(shí)例形式分析了Django框架基于Pillow模塊的圖形驗(yàn)證碼生成與使用相關(guān)操作技巧,需要的朋友可以參考下
    2019-05-05
  • python實(shí)現(xiàn)圖書借閱系統(tǒng)

    python實(shí)現(xiàn)圖書借閱系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)圖書借閱系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-02-02
  • 學(xué)會(huì)用Python實(shí)現(xiàn)滑雪小游戲,再也不用去北海道啦

    學(xué)會(huì)用Python實(shí)現(xiàn)滑雪小游戲,再也不用去北海道啦

    Python除了極少的事情不能做之外,其他基本上可以說(shuō)全能.,圖形處理、文本處理、數(shù)據(jù)庫(kù)編程、網(wǎng)絡(luò)編程、web編程、黑客編程、爬蟲編寫、機(jī)器學(xué)習(xí)、人工智能等.接下來(lái)我就教大家做一個(gè)不用去北海道也可以滑雪的小游戲,需要的朋友可以參考下
    2021-05-05
  • Python實(shí)現(xiàn)計(jì)算文件MD5和SHA1的方法示例

    Python實(shí)現(xiàn)計(jì)算文件MD5和SHA1的方法示例

    這篇文章主要介紹了Python實(shí)現(xiàn)計(jì)算文件MD5和SHA1的方法,結(jié)合具體實(shí)例形式分析了Python針對(duì)文件MD5及SHA1的計(jì)算方法,需要的朋友可以參考下
    2019-06-06
  • 通過(guò)代碼實(shí)例了解Python sys模塊

    通過(guò)代碼實(shí)例了解Python sys模塊

    這篇文章主要介紹了通過(guò)代碼實(shí)例了解Python sys模塊,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • 利用Python連接Oracle數(shù)據(jù)庫(kù)的基本操作指南

    利用Python連接Oracle數(shù)據(jù)庫(kù)的基本操作指南

    由于之前的在職的公司沒有機(jī)會(huì)接觸到Oralce數(shù)據(jù)庫(kù),所以就沒有用python連接過(guò)Oralce,之前大多集中在連接mysql和sql server,最近在做一下web自動(dòng)化的工作,所以簡(jiǎn)單的記錄一下,下面這篇文章主要給大家介紹了關(guān)于利用Python連接Oracle數(shù)據(jù)庫(kù)的基本操作,需要的朋友可以參考下
    2022-06-06
  • Python tkinter實(shí)現(xiàn)的圖片移動(dòng)碰撞動(dòng)畫效果【附源碼下載】

    Python tkinter實(shí)現(xiàn)的圖片移動(dòng)碰撞動(dòng)畫效果【附源碼下載】

    這篇文章主要介紹了Python tkinter實(shí)現(xiàn)的圖片移動(dòng)碰撞動(dòng)畫效果,涉及Python tkinter模塊操作圖片基于坐標(biāo)動(dòng)態(tài)變換與數(shù)值判定實(shí)現(xiàn)移動(dòng)、碰撞檢測(cè)等相關(guān)操作技巧,需要的朋友可以參考下
    2018-01-01

最新評(píng)論

隆子县| 三门县| 通化市| 高碑店市| 思茅市| 通道| 大冶市| 布尔津县| 大田县| 北票市| 金秀| 安国市| 彭水| 宝应县| 华池县| 新营市| 鄯善县| 家居| 那曲县| 勐海县| 迭部县| 隆安县| 霍邱县| 岫岩| 宾川县| 名山县| 临沧市| 滨州市| 乌拉特前旗| 攀枝花市| 石河子市| 怀远县| 巴里| 监利县| 洪洞县| 聂拉木县| 奇台县| 钟祥市| 台中县| 巴彦县| 屏南县|