日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python装饰器之property()详解

發布時間:2024/5/7 python 52 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python装饰器之property()详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. 何為裝飾器?

官方定義:裝飾器是一個很著名的設計模式,經常被用于有切面需求的場景,較為經典的有插入日志、性能測試、事務處理等。裝飾器是解決這類問題的絕佳設計,有了裝飾器,我們就可以抽離出大量函數中與函數功能本身無關的雷同代碼并繼續重用。概括的講,裝飾器的作用就是為已經存在的對象添加額外的功能。

Python中總共包括三個內置裝飾器:

① staticmethod

② classmethod

③ property

2. 屬性函數 property() 淺談

2.1 為什么要使用 property?

通常,我們在訪問屬性和給屬性賦值的時候,都是對 類和實例 __dict__ 打交道的;但如果我們想要規范屬性訪問,有兩種方式可用:①數據描述符 ,②. property() 屬性函數。

然而,我們知道,描述符相對比較復雜,對于新手來說,用起來很吃力,那么不妨試試property(),相對于描述符這個大的進程,property就相當于線程。

2.2 函數原型:
property(fget=None, fset=None, fdel=None, doc=None)

2.3 普通方法定義:
假設 calss Normal中有一個私有變量 __x,如下代碼所示:

#code 1 class Normal:def __init__(self):self.__x = Nonedef getx(self):return self.__xdef setx(self, value):self.__x = valuedef delx(self):del self.__x tN = Normal() print(tN.__count)

輸出結果(報錯了)

Traceback (most recent call last):File "C:/Users/Administrator/AppData/Local/Programs/Python/Python35/property.py", line 15, in <module>print(tN.__count) AttributeError: 'Normal' object has no attribute '__count'

為啥報錯了呢?因為 實例tN的屬性 __x 為私有屬性,不能直接訪問,為此我們只能調用內部定義的 方法;

tN = Normal() tN.setx(10) print(tN.getx())

輸出結果:

6 10

使用內部的方法,可以容易的得到實例的或者類的私有屬性值;

然而,如果我想把 class Normal 的 setx方法名改成了其它(如 Normal_setx),外部很多地方用到了該函數,是不是我需要一個一個的去找該方法的調用地點,然后一個一個的改呢?

c語言或許會,但Python,一個高級語言,怎么會這么點事都解決不了呢?

那么,該如何解決以上問題呢?

其實有兩種方法。

方法一:使用 屬性函數property()

class Normal:def __init__(self):self.__x = Nonedef getx(self):print('getx(): self.__x=', self.__x)return self.__xdef setx(self, value):self.__x = valueprint('setx()')def delx(self):print('delx()')del self.__xy = property(getx, setx, delx, "I'm a property") tN=Normal() tN.y=10 tN.y del tN.y #輸出結果: setx() getx(): self.__x= 10 delx()

直接把方法當屬性來操作了,非常方便

方法二:使用 @property 裝飾器

class Normal:def __init__(self):self.__x = None@propertydef xx(self):print('getx(): self.__x=', self.__x)return self.__x@xx.setterdef xx(self, value):self.__x = valueprint('setx()')@xx.deleterdef xx(self):print('delx()')del self.__x tN=Normal() tN.xx=10 tN.xx del tN.xx #輸出結果信息: setx() getx(): self.__x= 10 delx()

跟方法一 輸出同樣的結果,證明,這兩種方法都可行的(注意:第一個一定是 @property(替代getter哦,不然會報錯))。

總結

以上是生活随笔為你收集整理的Python装饰器之property()详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。