日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
創(chuàng)新互聯(lián)Python教程:Python中property特性屬性是什么

在Java中,通常在類中定義的成員變量為私有變量,在類的實(shí)例中不能直接通過(guò)對(duì)象.屬性直接操作,而是要通過(guò)getter和setter來(lái)操作私有變量。

10年積累的網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶對(duì)網(wǎng)站的新想法和需求。提供各種問(wèn)題對(duì)應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先網(wǎng)站策劃后付款的網(wǎng)站建設(shè)流程,更有玉林免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。

而在python中,因?yàn)橛蠵roperty這個(gè)概念,所以不需要寫getter和setter一堆重復(fù)的代碼來(lái)操作私有變量。Python“私有變量”通常在變量前加上“_”或者“__”,例如_attr或者_(dá)_attr,這是約定俗成的規(guī)范。

把私有屬性變成只讀特性

class MyClass:
    def __init__(self, x):
        self._x = x

這里定義了一個(gè)MyClass類,它有一個(gè)實(shí)例變量_x,綁定了用戶傳來(lái)的x值。_x是私有變量,通過(guò)obj._x獲取私有變量不符合語(yǔ)言規(guī)范,進(jìn)而我們要使_x變成property(特性),通過(guò)obj.x直接訪問(wèn)。

改造后的代碼如下:

class MyClass:
    def __init__(self, x):
        self._x = x
    @property
    def x(self):
        return self._x
    
>>> obj = MyClass(10)
>>> obj.x
10

我們把_x變成了property特性,以只讀的方式獲取x的值。

我們現(xiàn)在想為x賦值該怎樣做呢?

>>> obj.x = 999
Traceback (most recent call last):
  File "xxx", line 14, in 
    obj.x = 23
AttributeError: can't set attribute

可以看到,拋出了AttributeError: can't set attribute。顯然,只讀方法不支持賦值。

相關(guān)推薦:《Python視頻教程》

把私有變量變成可賦值的特性

我們只需要在上述代碼改造成:

class MyClass:
    def __init__(self, x):
        self._x = x
    @property
    def x(self):
        return self._x
    
    @x.setter
    def x(self, value):
        self._x = value
>>> obj = MyClass(10)
>>> obj.x = 999
>>> obj.x
999

可以看到,我們?yōu)閤添加了setter,可以直接為obj.x賦值操作。

property屬性能夠遮蓋實(shí)例屬性

繼續(xù)上面的代碼,我們看看以下的操作:

>>> obj = MyClass(10)
>>> obj.__dict__
{'_x': 999}  #此時(shí)實(shí)例變量中有_x的值
>>> obj.__dict__['x'] = 99999  #設(shè)置obj的實(shí)例變量有x值,跟property屬性重名!
>>> obj.__dict__
{'_x': 999, 'x': 99999}  #此時(shí)實(shí)例變量中有_x和x的值
>>> obj.x     #結(jié)果是obj的實(shí)例變量還是property屬性?
10

如上代碼所示,obj對(duì)象有一個(gè)_x實(shí)例變量和一個(gè)x的property屬性,我們又強(qiáng)行為obj增加了一個(gè)x實(shí)例變量,這個(gè)實(shí)例變量x和property屬性x同名!

通過(guò)obj.x我們得知,返回的是property屬性,說(shuō)明property屬性會(huì)遮蓋實(shí)例屬性!也可以理解為property屬性的優(yōu)先級(jí)更大!

property類解析

我們通常使用內(nèi)置的@property裝飾器。但其實(shí)property是一個(gè)類,python中類和函數(shù)的調(diào)用方式都差不多,他們都是可調(diào)用對(duì)象。

property的構(gòu)造方法如下:

class property(object):
    def __init__(self, fget=None, fset=None, fdel=None, doc=None):
        """"""

它接受4個(gè)參數(shù),都可以為空。

第一個(gè)為getter,第二個(gè)為setter,第三個(gè)為delete函數(shù),第四個(gè)為文檔。

上述代碼的另一種寫法

class MyClass:
    def __init__(self, x):
        self._x = x
    def get_x(self):
        return self._x
    def set_x(self, value):
        self._x = value
    x = property(get_x, set_x)
>>> obj = MyClass(10)
>>> obj.x
10

如上,x是property的實(shí)例,設(shè)置了getter和setter,作為類變量放在MyClass類中。

以上就是property屬性的解析。


當(dāng)前名稱:創(chuàng)新互聯(lián)Python教程:Python中property特性屬性是什么
瀏覽路徑:http://www.dlmjj.cn/article/cdjhjpg.html