国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

python 裝飾器功能以及函數參數使用介紹

2020-02-23 04:45:56
字體:
來源:轉載
供稿:網友
簡單的說:裝飾器主要作用就是對函數進行一些修飾,它的出現是在引入類方法和靜態方法的時候為了定義靜態方法出現的。例如為了把foo()函數聲明成一個靜態函數
代碼如下:
class Myclass(object):
def staticfoo():
............
............
staticfoo = staticmethod(staticfoo)

可以用裝飾器的方法實現:
代碼如下:
class Myclass(object):
  @staticmethod  
  def staticfoo():
    .........
    .........

這個例子很明顯很容易就可以看懂。

說到這里我們舉一個下面的例子,這個例子里面同時涉及到一個重要內容,就是對于python中的函數的本質理解。

代碼:
代碼如下:
# -*- coding: utf-8 -*-
from time import ctime
from time import sleep
def ftfunc(func):
def timef():
print "[%s] %s() called" % (ctime(),func.__name__)
return func()
return timef

@ftfunc
def foo():
print 'hello'

if __name__ == '__main__':

foo()
sleep(2)

for i in range(2):
sleep(1)
foo()

運行這段代碼;我們可以看到終端依次會輸出以下內容:


其中ftfunc函數是我們自己自定義的一個函數,這個函數是以一個函數作為參數的函數,這也就滿足了作為一個裝飾器的要求,根據上面我們對于裝飾器的等價變換規則,這段代碼
代碼如下:
@ftfunc
def foo():
print 'hello'

可以轉換成以下的代碼:
代碼如下:
def foo():
print 'hello'

foo = ftfunc(foo)

再結合上面原來的代碼我們很快就可以體會到了裝飾器的作用。

但是我在編寫這段代碼的時候,有一個地方打錯了:

這段代碼:
代碼如下:
return func()
return timef

被我寫成了:
代碼如下:
return func
return timef

于是輸出結果就是不一樣,后來終于發現了一個重要的概念:"foo"是函數對象的引用,而"foo()"是函數對象的調用。關于對象引用是python的重要的基礎概念,在python中一切都是對象,同時類型是屬于對象,而不是變量。一切的變量只是對象的引用,相當于讓這個變量指向這個對象。“foo”正好可以理解成一個變量,只不過是它指向一個函數的對象。而“foo()”是函數對象的調用,即調用這個對象,是要執行這個函數的功能的。這里需要慢慢理解品味。基于此:

這樣的一段代碼運行結果和剛才是一模一樣的。注意比較與剛才那段代碼的不同之處,更加有利于理解。
代碼如下:
# -*- coding: utf-8 -*-
from time import ctime
from time import sleep
def ftfunc(func):
def timef():
print "[%s] %s() called" % (ctime(),func.__name__)
return func
return timef

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 建昌县| 辽宁省| 若尔盖县| 彩票| 钦州市| 九龙坡区| 丰台区| 中阳县| 鹿邑县| 尼木县| 固原市| 景洪市| 曲松县| 壤塘县| 义乌市| 鲁山县| 桐庐县| 临西县| 天水市| 大竹县| 丰顺县| 海淀区| 南丰县| 荆州市| 富锦市| 红桥区| 芦溪县| 夹江县| 阿克| 神池县| 梓潼县| 砚山县| 万山特区| 贡山| 石渠县| 天水市| 平安县| 手机| 手机| 盐亭县| 仙桃市|