欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python裝飾器property和setter用法

 更新時(shí)間:2022年07月15日 17:28:28   作者:wx62cea850b9e28???????  
這篇文章主要介紹了python裝飾器property和setter用法,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下

1.引子:函數(shù)也是對象

木有括號的函數(shù)那就不是在調(diào)用。

def hi(name="yasoob"):
return "hi " + name
print(hi())
# output: 'hi yasoob'
# 我們甚至可以將一個(gè)函數(shù)賦值給一個(gè)變量,比如
greet = hi
# 我們這里沒有在使用小括號,因?yàn)槲覀儾⒉皇窃谡{(diào)用hi函數(shù)
# 而是在將它放在greet變量里頭。我們嘗試運(yùn)行下這個(gè)
print(greet())
# output: 'hi yasoob'
# 如果我們刪掉舊的hi函數(shù),看看會(huì)發(fā)生什么!
del hi
print(hi())
#outputs: NameError
print(greet())
#outputs: 'hi yasoob'

2.函數(shù)內(nèi)的函數(shù)

(1)在python中,一個(gè)函數(shù)內(nèi)能嵌套定義另一個(gè)函數(shù),并且可以在該大函數(shù)內(nèi)調(diào)用該小函數(shù)。

def hi(name="yasoob"):
print("now you are inside the hi() function")

def greet():
return "now you are in the greet() function"

def welcome():
return "now you are in the welcome() function"

print(greet())
print(welcome())
print("now you are back in the hi() function")

hi()
#output:now you are inside the hi() function
# now you are in the greet() function
# now you are in the welcome() function
# now you are back in the hi() function

# 上面展示了無論何時(shí)你調(diào)用hi(), greet()和welcome()將會(huì)同時(shí)被調(diào)用。
# 然后greet()和welcome()函數(shù)在hi()函數(shù)之外是不能訪問的,比如:
greet()
#outputs: NameError: name 'greet' is not defined

(2)開始神奇的是,大函數(shù)的返回值可以是一個(gè)函數(shù):

def hi(name="yasoob"):
def greet():
return "now you are in the greet() function"
def welcome():
return "now you are in the welcome() function"
if name == "yasoob":
return greet #這里?。?
else:
return welcome
a = hi()
print(a)
#outputs: <function greet at 0x7f2143c01500>
#上面清晰地展示了`a`現(xiàn)在指向到hi()函數(shù)中的greet()函數(shù)
#現(xiàn)在試試這個(gè)
print(a())
#outputs: now you are in the greet() function

在 if/else 語句中我們返回 greet 和 welcome,而不是 greet() 和 welcome()。
為什么那樣?這是因?yàn)楫?dāng)你把一對小括號放在后面,這個(gè)函數(shù)就會(huì)執(zhí)行;然而如果你不放括號在它后面,那它可以被到處傳遞,并且可以賦值給別的變量而不去執(zhí)行它。

當(dāng)我們寫下 a = hi(),hi() 會(huì)被執(zhí)行,而由于 name 參數(shù)默認(rèn)是 yasoob,所以函數(shù) greet 被返回了。

PS:如果我們打印出 hi()(),這會(huì)輸出 now you are in the greet() function。

(3)最后要說的是函數(shù)作為參數(shù)傳入一個(gè)函數(shù):

def hi():
return "hi yasoob!"
def doSomethingBeforeHi(func):
print("I am doing some boring work before executing hi()")
print(func())
doSomethingBeforeHi(hi)
#outputs:I am doing some boring work before executing hi()
# hi yasoob!

3.裝飾器小栗子

終于來到了帶@的裝飾器,其實(shí)就是帶了@帽子的函數(shù)作為參數(shù),傳入@后面的函數(shù)中。

def a_new_decorator(a_func):
def wrapTheFunction():
print("I am doing some boring work before executing a_func()")
a_func()
print("I am doing some boring work after executing a_func()")
return wrapTheFunction
@a_new_decorator
def a_function_requiring_decoration():
"""Hey you! Decorate me!"""
print("I am the function which needs some decoration to "
"remove my foul smell")

a_function_requiring_decoration()
#outputs: I am doing some boring work before executing a_func()
# I am the function which needs some decoration to remove my foul smell
# I am doing some boring work after executing a_func()
#the @a_new_decorator is just a short way of saying:
a_function_requiring_decoration = a_new_decorator(a_function_requiring_decoration)

上面的代碼等價(jià)于我們熟悉的:

def a_new_decorator(a_func):
def wrapTheFunction():
print("I am doing some boring work before executing a_func()")
a_func()
print("I am doing some boring work after executing a_func()")
return wrapTheFunction

def a_function_requiring_decoration():
print("I am the function which needs some decoration to remove my foul smell")

a_function_requiring_decoration()
#outputs: "I am the function which needs some decoration to remove my foul smell"
a_function_requiring_decoration = a_new_decorator(a_function_requiring_decoration)
#now a_function_requiring_decoration is wrapped by wrapTheFunction()
a_function_requiring_decoration()
#outputs:I am doing some boring work before executing a_func()
# I am the function which needs some decoration to remove my foul smell
# I am doing some boring work after executing a_func()

不過一開始上面被裝飾過的函數(shù)名字已經(jīng)悄悄發(fā)生“改變”,如果print下可以看出(如下代碼)。
解決方案:
@wraps接受一個(gè)函數(shù)來進(jìn)行裝飾,并加入了復(fù)制函數(shù)名稱、注釋文檔、參數(shù)列表等等的功能。這可以讓我們在裝飾器里面訪問在裝飾之前的函數(shù)的屬性。

print(a_function_requiring_decoration.__name__)
# Output: wrapTheFunction

最終加上@wraps的代碼如下:

from functools import wraps
def a_new_decorator(a_func):
@wraps(a_func)
def wrapTheFunction():
print("I am doing some boring work before executing a_func()")
a_func()
print("I am doing some boring work after executing a_func()")
return wrapTheFunction
@a_new_decorator
def a_function_requiring_decoration():
"""Hey yo! Decorate me!"""
print("I am the function which needs some decoration to "
"remove my foul smell")
print(a_function_requiring_decoration.__name__)
# Output: a_function_requiring_decoration

5.property和setter用法

class Timer:
def __init__(self, value = 0.0):
self._time = value
self._unit = 's'
# 使用裝飾器的時(shí)候,需要注意:
# 1. 裝飾器名,函數(shù)名需要一直
# 2. property需要先聲明,再寫setter,順序不能倒過來
@property
def time(self):
return str(self._time) + ' ' + self._unit
@time.setter
def time(self, value):
if(value < 0):
raise ValueError('Time cannot be negetive.')
self._time = value
t = Timer()
t.time = 1.0
print(t.time)

到此這篇關(guān)于python裝飾器property和setter用法的文章就介紹到這了,更多相關(guān)python property與setter內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python?列表常用方法超詳細(xì)梳理總結(jié)

    python?列表常用方法超詳細(xì)梳理總結(jié)

    這篇文章主要為大家介紹了Python中列表的幾個(gè)常用方法總結(jié),文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Python列表有一定幫助,需要的可以參考一下
    2022-03-03
  • Python針對給定列表中元素進(jìn)行翻轉(zhuǎn)操作的方法分析

    Python針對給定列表中元素進(jìn)行翻轉(zhuǎn)操作的方法分析

    這篇文章主要介紹了Python針對給定列表中元素進(jìn)行翻轉(zhuǎn)操作的方法,結(jié)合實(shí)例形式分析了Python針對列表元素基于切片及遍歷輸出兩種翻轉(zhuǎn)操作實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2018-04-04
  • Python爬蟲實(shí)現(xiàn)百度翻譯功能過程詳解

    Python爬蟲實(shí)現(xiàn)百度翻譯功能過程詳解

    這篇文章主要介紹了Python爬蟲實(shí)現(xiàn)百度翻譯功能過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • python爬取代理IP并進(jìn)行有效的IP測試實(shí)現(xiàn)

    python爬取代理IP并進(jìn)行有效的IP測試實(shí)現(xiàn)

    這篇文章主要介紹了python爬取代理IP并進(jìn)行有效的IP測試實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • Python文件的操作示例的詳細(xì)講解

    Python文件的操作示例的詳細(xì)講解

    本問重點(diǎn)講解了Python文件的讀寫原理、常用文件打開模式、文件對象的常用方法和目錄的相關(guān)操作詳細(xì)講解,對Python文件操作相關(guān)知識感興趣的朋友跟隨小編一起看看吧
    2021-04-04
  • vue學(xué)習(xí)筆記之動(dòng)態(tài)組件和v-once指令簡單示例

    vue學(xué)習(xí)筆記之動(dòng)態(tài)組件和v-once指令簡單示例

    這篇文章主要介紹了vue學(xué)習(xí)筆記之動(dòng)態(tài)組件和v-once指令,結(jié)合簡單實(shí)例形式詳細(xì)分析了vue.js動(dòng)態(tài)組建點(diǎn)擊切換相關(guān)操作技巧,需要的朋友可以參考下
    2020-02-02
  • python人工智能遺傳算法示例解析

    python人工智能遺傳算法示例解析

    這篇文章主要為大家介紹了python人工智能遺傳算法示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • python 使用pandas同時(shí)對多列進(jìn)行賦值

    python 使用pandas同時(shí)對多列進(jìn)行賦值

    這篇文章主要介紹了python 使用pandas同時(shí)對多列進(jìn)行賦值操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • PyCharm設(shè)置SSH遠(yuǎn)程調(diào)試的方法

    PyCharm設(shè)置SSH遠(yuǎn)程調(diào)試的方法

    這篇文章主要介紹了PyCharm設(shè)置SSH遠(yuǎn)程調(diào)試的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-07-07
  • python中Selenium+Webdriver實(shí)現(xiàn)自動(dòng)化登錄

    python中Selenium+Webdriver實(shí)現(xiàn)自動(dòng)化登錄

    本文主要介紹了python中Selenium+Webdriver實(shí)現(xiàn)自動(dòng)化登錄,包括測試環(huán)境的搭建、代碼編寫、以及注意事項(xiàng)等,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-09-09

最新評論