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

歡迎訪問 生活随笔!

生活随笔

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

python

Python3 property属性

發布時間:2025/3/21 python 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python3 property属性 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

python3中的property有一個很有意思的功能,它能將類中的方法像類屬性一樣調用!

class?property(fget=None,?fset=None,?fdel=None,?doc=None)

我們先來簡單了解一下這個property類,下面看一下官網給出的例子:

class?C:def?__init__(self):self._x?=?Nonedef?getx(self):return?self._xdef?setx(self,?value):self._x?=?valuedef?delx(self):del?self._xx?=?property(getx,?setx,?delx,?"I'm?the?'x'?property.")??#?這里的x相當于類屬性c?=?C()??#?生成一個對象 c.x?=?10??#?設置self._x=10,實際調用的就是類中setx方法 c.x??#?獲取self._x的值,實際調用的就是類中getx方法 del?c.x??#?刪除self._x的值,實際調用的就是類中delx方法

????是不是感覺很有意思,很不可思議!property中fget是一個函數,它獲取屬性值;fset是一個函數,它設置一個屬性值;fdel是一個函數,它刪除一個屬性值;doc為該屬性創建一個docstring。你只要在使用時在對應的形參位置放上你寫的對應函數,就可以輕松使用了。


我們還可以將property作為裝飾器來使用,還是使用官網的例子:

class?C:def?__init__(self):self._x?=?None@propertydef?x(self):"""I'm?the?'x'?property."""return?self._x@x.setterdef?x(self,?value):self._x?=?value@x.deleterdef?x(self):del?self._x

????property對象有getter、setter、deleter三個方法,getter獲取屬性值,setter設置屬性值,deleter設置屬性值,這個例子的效果跟上一個例子的效果完全相同!我們看到里面的方法名是一模一樣的,但是達到的效果卻是不同的。第一個x方法是獲取屬性值,第二個x方法是設置屬性值,第三個x方法是刪除屬性值。

????你看到這里是不是以為這一切都是property幫你做到的,錯,錯,錯!其實property只做了一件事件,它將你的方法能像類屬性一樣使用,至于里面的查、刪、改,其實都是你自己寫的函數實現的!fget、fset、fdel、setter、deleter這些僅僅只是名字而且,方便你識別,其他什么作用都沒有!

我們來看一下property的源代碼:

class?property(object):"""property(fget=None,?fset=None,?fdel=None,?doc=None)?->?property?attributefget?is?a?function?to?be?used?for?getting?an?attribute?value,?and?likewisefset?is?a?function?for?setting,?and?fdel?a?function?for?del'ing,?anattribute.??Typical?use?is?to?define?a?managed?attribute?x:class?C(object):def?getx(self):?return?self._xdef?setx(self,?value):?self._x?=?valuedef?delx(self):?del?self._xx?=?property(getx,?setx,?delx,?"I'm?the?'x'?property.")Decorators?make?defining?new?properties?or?modifying?existing?ones?easy:class?C(object):@propertydef?x(self):"I?am?the?'x'?property."return?self._x@x.setterdef?x(self,?value):self._x?=?value@x.deleterdef?x(self):del?self._x"""def?deleter(self,?*args,?**kwargs):?#?real?signature?unknown"""?Descriptor?to?change?the?deleter?on?a?property.?"""passdef?getter(self,?*args,?**kwargs):?#?real?signature?unknown"""?Descriptor?to?change?the?getter?on?a?property.?"""passdef?setter(self,?*args,?**kwargs):?#?real?signature?unknown"""?Descriptor?to?change?the?setter?on?a?property.?"""passdef?__delete__(self,?*args,?**kwargs):?#?real?signature?unknown"""?Delete?an?attribute?of?instance.?"""passdef?__getattribute__(self,?*args,?**kwargs):?#?real?signature?unknown"""?Return?getattr(self,?name).?"""passdef?__get__(self,?*args,?**kwargs):?#?real?signature?unknown"""?Return?an?attribute?of?instance,?which?is?of?type?owner.?"""passdef?__init__(self,?fget=None,?fset=None,?fdel=None,?doc=None):?#?known?special?case?of?property.__init__"""property(fget=None,?fset=None,?fdel=None,?doc=None)?->?property?attributefget?is?a?function?to?be?used?for?getting?an?attribute?value,?and?likewisefset?is?a?function?for?setting,?and?fdel?a?function?for?del'ing,?anattribute.??Typical?use?is?to?define?a?managed?attribute?x:class?C(object):def?getx(self):?return?self._xdef?setx(self,?value):?self._x?=?valuedef?delx(self):?del?self._xx?=?property(getx,?setx,?delx,?"I'm?the?'x'?property.")Decorators?make?defining?new?properties?or?modifying?existing?ones?easy:class?C(object):@propertydef?x(self):"I?am?the?'x'?property."return?self._x@x.setterdef?x(self,?value):self._x?=?value@x.deleterdef?x(self):del?self._x#?(copied?from?class?doc)"""pass@staticmethod?#?known?case?of?__new__def?__new__(*args,?**kwargs):?#?real?signature?unknown"""?Create?and?return?a?new?object.??See?help(type)?for?accurate?signature.?"""passdef?__set__(self,?*args,?**kwargs):?#?real?signature?unknown"""?Set?an?attribute?of?instance?to?value.?"""passfdel?=?property(lambda?self:?object(),?lambda?self,?v:?None,?lambda?self:?None)??#?defaultfget?=?property(lambda?self:?object(),?lambda?self,?v:?None,?lambda?self:?None)??#?defaultfset?=?property(lambda?self:?object(),?lambda?self,?v:?None,?lambda?self:?None)??#?default__isabstractmethod__?=?property(lambda?self:?object(),?lambda?self,?v:?None,?lambda?self:?None)??#?default

????看到上面的源代碼恍然大悟沒,fdel、fget、fset都只是執行你函數里面的代碼而已!所以我們就記住一句話就夠了:“property能讓你的方法像類屬性一樣使用”。



轉載于:https://blog.51cto.com/daibaiyang119/1972460

總結

以上是生活随笔為你收集整理的Python3 property属性的全部內容,希望文章能夠幫你解決所遇到的問題。

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