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

淺談python裝飾器探究與參數(shù)的領(lǐng)取

 更新時(shí)間:2017年12月01日 08:38:16   作者:ansver  
下面小編就為大家分享一篇淺談python裝飾器探究與參數(shù)的領(lǐng)取,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧

首先上原文:

現(xiàn)在,假設(shè)我們要增強(qiáng)now()函數(shù)的功能,比如,在函數(shù)調(diào)用前后自動(dòng)打印日志,但又不希望修改now()函數(shù)的定義,這種在代碼運(yùn)行期間動(dòng)態(tài)增加功能的方式,稱之為“裝飾器”(Decorator)。

本質(zhì)上,decorator就是一個(gè)返回函數(shù)的高階函數(shù)。

Decorator本質(zhì)是高階函數(shù)?

不信邪的我試了下..

def g():
 print("這里是G")
 return "G"

@g
def f():
 print("這里是F")
 return 1
'''
--------------------------------------------
line 5, in <module>
 @g
TypeError: g() takes 0 positional arguments but 1 was given
>>>
'''

運(yùn)行結(jié)果在注釋里

尷尬了...g被強(qiáng)制塞了個(gè)參數(shù),那個(gè)參數(shù)應(yīng)該是g"修飾的對象"

修改下繼續(xù).....

def g(f):
 print("這里是G")
 return "G"

@g
def f():
 print("這里是F")
 return 1
'''
--------------------------------------------
這里是G
>>> f()
Traceback (most recent call last):
 File "<pyshell#0>", line 1, in <module>
 f()
TypeError: 'str' object is not callable
'''

str對象不能被調(diào)用,,,這里的str只有一個(gè),就是g的返回值

為了驗(yàn)證下,我把"G"改成了2

結(jié)果是

TypeError: 'int' object is not callable

OK了,大概意思就是,裝飾器首先被"塞"一個(gè)參數(shù),然后,返回值還要被調(diào)用一次,然而好像只有函數(shù)才能被調(diào)用,,所以,為了不報(bào)錯(cuò),裝飾器必須返回一個(gè)函數(shù),裝飾器必須是高階函數(shù)......

我表示不服( ̄へ ̄),不就是函數(shù)嗎,g的參數(shù)就是函數(shù),,,騷操作上腦ing

def g(f):
 print("這里是G")
 return f

@g
def f():
 print("這里是F")
 return 1
'''
--------------------------------------------
這里是G
>>> f()
這里是F
'1'
'''

運(yùn)行成功.但是....說好的"打印日志功能"呢,#沒錯(cuò)"這里是G"就是我想要的日志

疑點(diǎn)一: 打印的"這里是G"是第一行,是在輸入"f()"之前發(fā)生的....

疑點(diǎn)二: 輸入"f()"后,"這里是G"沒打出來.....

#單看g函數(shù),它不算是"高階函數(shù)"

作為成功的例子,它太失敗了┐( ̄ヘ ̄)┌

##好吧,我投降了,負(fù)隅頑抗也不怎么有意思.....

閉包告訴我們一個(gè)道理,,,為了保證返回值一定是函數(shù),最好的措施就是"在函數(shù)內(nèi)部,現(xiàn)場造一個(gè)函數(shù)然后扔出去"

def g(f):
 print("這里是G")
 def h():
  print('這里是H')
  return "H"
 return h

@g
def f():
 print("這里是F")
 return 1
'''
--------------------------------------------
這里是G
>>> f()
這里是H
'H'
>>> f()
這里是H
'H'
>>> 
'''

f函數(shù)不執(zhí)行了,,是的沒錯(cuò),我還多試了一次的

另外,兩條日志只有里面的能用......(下文會(huì)解釋的)

看了一下書,h函數(shù)返回f()的話,f函數(shù)就能被執(zhí)行了,,,,,個(gè)人感覺裝飾器應(yīng)該叫"劫持器"

def g(f):
 print("這里是G")
 def h():
  print('這里是H')
  return f()
 return h

@g
def f():
 print("這里是F")
 return 1
'''
--------------------------------------------
這里是G
>>> f()
這里是H
這里是F
'1'
>>> f
<function g.<locals>.h at 0x0000020CBDBB6C80>
'''

按書上的思路解釋下

'''
@g
def f():
 pass
>>>f()
等價(jià)于
>>>g(f) ()
g函數(shù)執(zhí)行,返回
>>>h ()
h函數(shù)執(zhí)行(打印日志)
>>>f()
f執(zhí)行,返回1
>>>1
'''

加上參數(shù),

def g(f):
 print("這里是G")
 def h(*args,**kw):
  print('這里是H')
  return f(*args,**kw)
 return h

@g
def f(*args,**kw):
 print("這里是F")
 return "1"
'''
>>>f(*args,**kw)
等價(jià)于
>>>g(f) (*args,**kw)
g函數(shù)執(zhí)行,返回
>>>h (*args,**kw)
h函數(shù)執(zhí)行(打印日志)
>>>f(*args,**kw)
f執(zhí)行,返回1
>>>1
'''

可以看出,(*args,**kw)本改被h函數(shù)拿走,所以,觀察h函數(shù),h把它的參數(shù)原封不動(dòng)的交給了f

機(jī)智的我動(dòng)了歪主意

def g(f):
 print("這里是G")
 def h():#h沒要求參數(shù)
  print('這里是H')
  return f
 return h

@g
def f(*args,**kw):
 print("這里是F")
 return "1"
'''
>>>f()(*args,**kw)
等價(jià)于
>>>g(f) ()(*args,**kw)
g函數(shù)執(zhí)行,返回
>>>h ()(*args,**kw)
h函數(shù)執(zhí)行,h拿的空參數(shù)
(打印日志)
>>>f(*args,**kw)
f執(zhí)行,返回1
>>>1
'''

可是新的問題來了,后面f調(diào)用的時(shí)候得多加個(gè)空括號,否則

'''
>>>f(*args,**kw)
等價(jià)于
>>>g(f) (*args,**kw)
g函數(shù)執(zhí)行,返回
>>>h (*args,**kw)
h函數(shù)執(zhí)行(打印日志)返回f
>>>f
這是一個(gè)函數(shù)對象
'''

以上告訴我們一個(gè)道理"函數(shù)執(zhí)行不執(zhí)行取決于后面有沒有括號"

舉個(gè)例子

def m(a):
 print(a)
 return m

print(m(1)(2)(3)(4)(5)(6)(7)(8)(9)(10))
'''
-----------------------------
2
4
6
8
10
<function m at 0x000002832BDB10D0>

燒腦時(shí)刻

f = a.b.c()()[0]()[d()()[e]]

a模塊的b類的c方法是高階函數(shù),最終返回一個(gè)列表,列表里有個(gè)函數(shù)

函數(shù)又返回一個(gè)字典............

以上這篇淺談python裝飾器探究與參數(shù)的領(lǐng)取就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • OpenCV半小時(shí)掌握基本操作之模板匹配

    OpenCV半小時(shí)掌握基本操作之模板匹配

    這篇文章主要介紹了OpenCV基本操作之模板匹配,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-09-09
  • Python實(shí)現(xiàn)多維數(shù)據(jù)分析的示例詳解

    Python實(shí)現(xiàn)多維數(shù)據(jù)分析的示例詳解

    多維數(shù)據(jù)分析是對數(shù)據(jù)的信息分析,它考慮了許多關(guān)系,這篇文章主要為大家詳細(xì)介紹了一些使用Python分析多維/多變量數(shù)據(jù)的基本技術(shù),希望對大家有所幫助
    2023-11-11
  • Pycharm中切換pytorch的環(huán)境和配置的教程詳解

    Pycharm中切換pytorch的環(huán)境和配置的教程詳解

    這篇文章主要介紹了Pycharm中切換pytorch的環(huán)境和配置,本文給大家介紹的非常詳細(xì),對大家的工作或?qū)W習(xí)具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-03-03
  • plotly分割顯示mnist的方法詳解

    plotly分割顯示mnist的方法詳解

    這篇文章主要為大家詳細(xì)介紹了plotly分割顯示mnist的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • Python Beautiful Soup模塊使用教程詳解

    Python Beautiful Soup模塊使用教程詳解

    Beautiful Soup 簡稱 BS4(其中 4 表示版本號)是一個(gè) Python 中常用的頁面解析庫,它可以從 HTML 或 XML 文檔中快速地提取指定的數(shù)據(jù),這篇文章主要介紹了Python Beautiful Soup模塊的使用
    2023-02-02
  • Python和Sublime整合過程圖示

    Python和Sublime整合過程圖示

    這篇文章主要介紹了Python和Sublime整合過程圖示,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • 在cmd中運(yùn)行.py文件: python的操作步驟

    在cmd中運(yùn)行.py文件: python的操作步驟

    今天小編就為大家分享一篇在cmd中運(yùn)行.py文件: python的操作步驟,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • Python安裝OpenCV的示例代碼

    Python安裝OpenCV的示例代碼

    這篇文章主要介紹了Python安裝OpenCV的示例代碼,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-03-03
  • python mongo 向數(shù)據(jù)中的數(shù)組類型新增數(shù)據(jù)操作

    python mongo 向數(shù)據(jù)中的數(shù)組類型新增數(shù)據(jù)操作

    這篇文章主要介紹了python mongo 向數(shù)據(jù)中的數(shù)組類型新增數(shù)據(jù)操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Python打印九九乘法表的5種方式代碼示例

    Python打印九九乘法表的5種方式代碼示例

    在Python中打印99乘法表的方法有很多種,比如for-for、while-while、while-for等,這篇文章主要給大家介紹了關(guān)于Python打印九九乘法表的5種方式,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-04-04

最新評論

新化县| 诸城市| 胶南市| 青阳县| 甘洛县| 奉节县| 靖宇县| 日喀则市| 赤水市| 芜湖县| 屏边| 铜山县| 黄梅县| 类乌齐县| 滁州市| 苍梧县| 班玛县| 乌兰察布市| 竹北市| 寿光市| 随州市| 荆州市| 西峡县| 乐陵市| 阳新县| 嘉祥县| 浠水县| 桐城市| 仪征市| 莱芜市| 大石桥市| 海宁市| 双鸭山市| 宿州市| 长泰县| 宜阳县| 洪泽县| 巴楚县| 宜城市| 盘锦市| 曲靖市|