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属性的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。