python 裝飾器功能以及函數(shù)參數(shù)使用介紹
class Myclass(object):
def staticfoo():
............
............
staticfoo = staticmethod(staticfoo)
可以用裝飾器的方法實(shí)現(xiàn):
class Myclass(object):
@staticmethod
def staticfoo():
.........
.........
這個(gè)例子很明顯很容易就可以看懂。
說(shuō)到這里我們舉一個(gè)下面的例子,這個(gè)例子里面同時(shí)涉及到一個(gè)重要內(nèi)容,就是對(duì)于python中的函數(shù)的本質(zhì)理解。
代碼:
# -*- 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ī)則,這段代碼
@ftfunc
def foo():
print 'hello'
可以轉(zhuǎn)換成以下的代碼:
def foo():
print 'hello'
foo = ftfunc(foo)
再結(jié)合上面原來(lái)的代碼我們很快就可以體會(huì)到了裝飾器的作用。
但是我在編寫(xiě)這段代碼的時(shí)候,有一個(gè)地方打錯(cuò)了:
這段代碼:
return func()
return timef
被我寫(xiě)成了:
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í)類(lèi)型是屬于對(duì)象,而不是變量。一切的變量只是對(duì)象的引用,相當(dāng)于讓這個(gè)變量指向這個(gè)對(duì)象。“foo”正好可以理解成一個(gè)變量,只不過(guò)是它指向一個(gè)函數(shù)的對(duì)象。而“foo()”是函數(shù)對(duì)象的調(diào)用,即調(diào)用這個(gè)對(duì)象,是要執(zhí)行這個(gè)函數(shù)的功能的。這里需要慢慢理解品味?;诖耍?
這樣的一段代碼運(yùn)行結(jié)果和剛才是一模一樣的。注意比較與剛才那段代碼的不同之處,更加有利于理解。
# -*- 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ù)的概念。
相關(guān)文章
詳解Python匿名函數(shù)(lambda函數(shù))
這篇文章主要介紹了Python匿名函數(shù)(lambda函數(shù)),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04
pygame實(shí)現(xiàn)俄羅斯方塊游戲(AI篇1)
這篇文章主要為大家詳細(xì)介紹了pygame實(shí)現(xiàn)俄羅斯方塊游戲AI的第1篇,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-10-10
使用PyTorch實(shí)現(xiàn)限制GPU顯存的可使用上限
從?PyTorch?1.4?版本開(kāi)始,引入了一個(gè)新的功能,可以允許用戶為特定的?GPU?設(shè)備設(shè)置進(jìn)程可使用的顯存上限比例,下面我們就來(lái)看看具體實(shí)現(xiàn)方法吧2024-03-03
Python實(shí)現(xiàn)圖像手繪效果的方法詳解
這篇文章主要為大家詳細(xì)介紹了如何利用Python語(yǔ)言實(shí)現(xiàn)圖像手繪效果,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以參考一下2022-09-09
Python使用type動(dòng)態(tài)創(chuàng)建類(lèi)操作示例
這篇文章主要介紹了Python使用type動(dòng)態(tài)創(chuàng)建類(lèi)操作,結(jié)合實(shí)例形式詳細(xì)分析了Python使用type動(dòng)態(tài)創(chuàng)建類(lèi)的具體原理、實(shí)現(xiàn)方法與操作注意事項(xiàng),需要的朋友可以參考下2020-02-02
python實(shí)現(xiàn)倒計(jì)時(shí)小工具
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)倒計(jì)時(shí)小工具,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-07-07
pandas基于時(shí)間序列的固定時(shí)間間隔求均值的方法
今天小編就為大家分享一篇pandas基于時(shí)間序列的固定時(shí)間間隔求均值的方法,具有好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-07-07
在Windows上安裝和配置 Jupyter Lab 作為桌面級(jí)應(yīng)用程序教程
這篇文章主要介紹了在Windows上安裝和配置 Jupyter Lab 作為桌面級(jí)應(yīng)用程序教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04
Python實(shí)現(xiàn)HTML轉(zhuǎn)Word的示例代碼
這篇文章主要為大家詳細(xì)介紹了使用Python實(shí)現(xiàn)HTML轉(zhuǎn)Word的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-12-12

