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

首頁(yè) > 編程 > Python > 正文

python 裝飾器功能以及函數(shù)參數(shù)使用介紹

2019-11-25 18:42:55
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
簡(jiǎn)單的說(shuō):裝飾器主要作用就是對(duì)函數(shù)進(jìn)行一些修飾,它的出現(xiàn)是在引入類方法和靜態(tài)方法的時(shí)候?yàn)榱硕x靜態(tài)方法出現(xiàn)的。例如為了把foo()函數(shù)聲明成一個(gè)靜態(tài)函數(shù)
復(fù)制代碼 代碼如下:

class Myclass(object):
def staticfoo():
............
............
staticfoo = staticmethod(staticfoo)

可以用裝飾器的方法實(shí)現(xiàn):
復(fù)制代碼 代碼如下:

class Myclass(object):
  @staticmethod  
  def staticfoo():
    .........
    .........

這個(gè)例子很明顯很容易就可以看懂。

說(shuō)到這里我們舉一個(gè)下面的例子,這個(gè)例子里面同時(shí)涉及到一個(gè)重要內(nèi)容,就是對(duì)于python中的函數(shù)的本質(zhì)理解。

代碼:
復(fù)制代碼 代碼如下:

# -*- 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()

運(yùn)行這段代碼;我們可以看到終端依次會(huì)輸出以下內(nèi)容:


其中ftfunc函數(shù)是我們自己自定義的一個(gè)函數(shù),這個(gè)函數(shù)是以一個(gè)函數(shù)作為參數(shù)的函數(shù),這也就滿足了作為一個(gè)裝飾器的要求,根據(jù)上面我們對(duì)于裝飾器的等價(jià)變換規(guī)則,這段代碼

復(fù)制代碼 代碼如下:

@ftfunc
def foo():
print 'hello'

可以轉(zhuǎn)換成以下的代碼:
復(fù)制代碼 代碼如下:

def foo():
print 'hello'

foo = ftfunc(foo)

再結(jié)合上面原來(lái)的代碼我們很快就可以體會(huì)到了裝飾器的作用。

但是我在編寫這段代碼的時(shí)候,有一個(gè)地方打錯(cuò)了:

這段代碼:
復(fù)制代碼 代碼如下:

return func()
return timef

被我寫成了:
復(fù)制代碼 代碼如下:

return func
return timef

于是輸出結(jié)果就是不一樣,后來(lái)終于發(fā)現(xiàn)了一個(gè)重要的概念:"foo"是函數(shù)對(duì)象的引用,而"foo()"是函數(shù)對(duì)象的調(diào)用。關(guān)于對(duì)象引用是python的重要的基礎(chǔ)概念,在python中一切都是對(duì)象,同時(shí)類型是屬于對(duì)象,而不是變量。一切的變量只是對(duì)象的引用,相當(dāng)于讓這個(gè)變量指向這個(gè)對(duì)象?!癴oo”正好可以理解成一個(gè)變量,只不過(guò)是它指向一個(gè)函數(shù)的對(duì)象。而“foo()”是函數(shù)對(duì)象的調(diào)用,即調(diào)用這個(gè)對(duì)象,是要執(zhí)行這個(gè)函數(shù)的功能的。這里需要慢慢理解品味?;诖耍?

這樣的一段代碼運(yùn)行結(jié)果和剛才是一模一樣的。注意比較與剛才那段代碼的不同之處,更加有利于理解。
復(fù)制代碼 代碼如下:

# -*- 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()()

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

其實(shí)還可以分別對(duì)返回的timef函數(shù)加上括號(hào),看看結(jié)果會(huì)是怎么樣的??梢愿美斫鈖ython中函數(shù)的概念。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 精河县| 新营市| 邢台市| 贵溪市| 宁晋县| 密山市| 苏尼特左旗| 灵丘县| 家居| 类乌齐县| 东台市| 宝鸡市| 菏泽市| 虎林市| 大悟县| 根河市| 剑川县| 上虞市| 湖北省| 社会| 富锦市| 乐昌市| 平利县| 平果县| 西昌市| 县级市| 东城区| 滁州市| 梨树县| 汉沽区| 芦溪县| 龙陵县| 静安区| 迁西县| 乐平市| 腾冲县| 鹿邑县| 枝江市| 孝昌县| 定襄县| 博乐市|