python3中的property有一個(gè)很有意思的功能,它能將類中的方法像類屬性一樣調(diào)用!
class?property(fget=None,?fset=None,?fdel=None,?doc=None)
我們先來簡(jiǎn)單了解一下這個(gè)property類,下面看一下官網(wǎng)給出的例子:
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相當(dāng)于類屬性c?=?C()??#?生成一個(gè)對(duì)象
c.x?=?10??#?設(shè)置self._x=10,實(shí)際調(diào)用的就是類中setx方法
c.x??#?獲取self._x的值,實(shí)際調(diào)用的就是類中g(shù)etx方法
del?c.x??#?刪除self._x的值,實(shí)際調(diào)用的就是類中delx方法
????是不是感覺很有意思,很不可思議!property中fget是一個(gè)函數(shù),它獲取屬性值;fset是一個(gè)函數(shù),它設(shè)置一個(gè)屬性值;fdel是一個(gè)函數(shù),它刪除一個(gè)屬性值;doc為該屬性創(chuàng)建一個(gè)docstring。你只要在使用時(shí)在對(duì)應(yīng)的形參位置放上你寫的對(duì)應(yīng)函數(shù),就可以輕松使用了。
我們還可以將property作為裝飾器來使用,還是使用官網(wǎng)的例子:
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對(duì)象有g(shù)etter、setter、deleter三個(gè)方法,getter獲取屬性值,setter設(shè)置屬性值,deleter設(shè)置屬性值,這個(gè)例子的效果跟上一個(gè)例子的效果完全相同!我們看到里面的方法名是一模一樣的,但是達(dá)到的效果卻是不同的。第一個(gè)x方法是獲取屬性值,第二個(gè)x方法是設(shè)置屬性值,第三個(gè)x方法是刪除屬性值。
????你看到這里是不是以為這一切都是property幫你做到的,錯(cuò),錯(cuò),錯(cuò)!其實(shí)property只做了一件事件,它將你的方法能像類屬性一樣使用,至于里面的查、刪、改,其實(shí)都是你自己寫的函數(shù)實(shí)現(xiàn)的!fget、fset、fdel、setter、deleter這些僅僅只是名字而且,方便你識(shí)別,其他什么作用都沒有!
我們來看一下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都只是執(zhí)行你函數(shù)里面的代碼而已!所以我們就記住一句話就夠了:“property能讓你的方法像類屬性一樣使用”。
轉(zhuǎn)載于:https://blog.51cto.com/daibaiyang119/1972460
總結(jié)
以上是生活随笔為你收集整理的Python3 property属性的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。