Python中的裝飾器如何使用?相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

創新互聯公司是專業的永定網站建設公司,永定接單;提供做網站、成都網站建設,網頁設計,網站設計,建網站,PHP網站建設等專業做網站服務;采用PHP框架,可快速的進行永定網站開發網頁制作和功能擴展;專業做搜索引擎喜愛的網站,專業的做網站團隊,希望更多企業前來合作!
python的裝飾器是python的特色高級功能之一,言簡意賅得說,其作用是在不改變其原有函數和類的定義的基礎上,給他們增添新的功能。
裝飾器存在的意義是什么呢?我們知道,在python中函數可以調用,類可以繼承,為何要必須保證不改變函數和類的定義,就使得函數有了新的功能呢?其實很好解釋。
提高代碼的簡潔程度與封裝性。如果你采用新聲明一個函數,并調用原來函數的思路使得原函數功能增加了,但是一方面使用起來看著不簡潔, 另一方面當另一個程序員使用你的代碼時再使用這樣的思路,那代碼嵌套無窮無盡,會讓代碼變得很亂,說不定改錯了哪里,動了原函數哪個參數,就會出現發現不了的bug。
我們先來看一個簡單的例子。
def addworld(func): def addfun(): return func() + 'world' return addfun() @addworld def printhello(): return 'hello' print(printhello)
這段代碼最后運行出來的結果是helloworld。我們發現,只要在原函數頭上加一個你定義好了的增添功能的模板,以后凡是加上這個,都會增添一個功能,這提高了開發效率,也看著更加簡潔。
def addnum(func): def addfun(*args, **kwargs): ret = func(*args, **kwargs)*2 return ret return addfun @addnum def printsum(a, b): return (a+b) i = printsum(7, 7) print(i)
這是有參數的情況下,裝飾器的使用效果,輸出結果為28。
def addnum1(c): def addnum(func): def addfun(*args, **kwargs): ret = func(*args, **kwargs)*2*c return ret return addfun return addnum @addnum1(5) def printsum(a, b): return (a+b) i = printsum(7, 7) print(i)
裝飾器本身也是可以傳參的,在這個程序中,傳入了一個常數5,最后得出的結果是140。
接下來,我們介紹幾個常用的python內置裝飾器。
property
在綁定屬性時,如果我們直接把屬性暴露出去,雖然寫起來很簡單,但是,沒辦法檢查參數,導致可以把成績隨便改。這樣顯然是不行的,那么在函數中,我們往往如何提高程序的魯棒性呢?
class Student(object):
    def get_score(self):
        return self._score
    def set_score(self, value):
        if not isinstance(value, int):
            raise ValueError('score must be an integer!')
        if value < 0 or value > 100:
            raise ValueError('score must between 0 ~ 100!')
        self._score = value
s = Student()
s.set_score(60)
value = s.get_score()
print(value)通過調用類中的函數從而進一步操作屬性,這樣雖然安全正確卻未免看著復雜,不貼近人類自然的屬性表現。
class Student(object):
    @property
    def score(self):
        return self._score
    @score.setter
    def score(self, value):
        if not isinstance(value, int):
            raise ValueError('score must be an integer!')
        if value < 0 or value > 100:
            raise ValueError('score must between 0 ~ 100!')
        self._score = value
s = Student()
s.score = 80
print(s.score)而加上一個@property就可以輕松解決這個問題,是不是很奇妙?把一個getter方法變成屬性,只需要加上@property就可以了,此時,@property本身又創建了另一個裝飾器@score.setter,負責把一個setter方法變成屬性賦值,于是,我們就擁有一個可控的屬性操作。
還可以定義只讀屬性,只定義getter方法,不定義setter方法就是一個只讀屬性。
class Student(object): @property def birth(self): return self._birth @birth.setter def birth(self, value): self._birth = value @property def age(self): return 2014 - self._birth
上面的birth是可讀寫屬性,而age就是一個只讀屬性,因為age可以根據birth和當前時間計算出來。
看完上述內容,你們掌握Python中的裝飾器如何使用的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注創新互聯行業資訊頻道,感謝各位的閱讀!
                當前名稱:Python中的裝飾器如何使用
                
                文章鏈接:http://www.yijiale78.com/article48/pcsphp.html
            
成都網站建設公司_創新互聯,為您提供微信小程序、網站策劃、、外貿建站、Google、小程序開發
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯