python 中的動態(tài)屬性和特性(Property)

Property

在python中,數(shù)據(jù)的屬性和處理方法統(tǒng)稱屬性(attribute),其實(shí),方法只是可調(diào)用的屬性,除了二者之外,我們還可以創(chuàng)建特性(property)
現(xiàn)在舉一個例子:

class LineItem:
    def __init__(self, description, weight, price):
        self.description = description
        self.weight = weight
        self.price = price

    def subtotal(self):
        return self.weight * self.price

    @property
    def weight(self):
        return self.__weight

    @weight.setter
    def weight(self, value):
        if value > 0:
            self.__weight = value
        else:
            raise ValueError('weight必須大于0')

test = LineItem("test",1,1)
a=test.subtotal()
print(a)

解釋:在為weight賦值的時候,會去執(zhí)行@Property裝飾的weight方法,會去檢測weight的值大小
應(yīng)用:在博客案例中。我對密碼進(jìn)行賦值的時候。當(dāng)然不能用明文賦值
啊?在賦值的時候會去執(zhí)行password 然后把hash過后的值存入


擴(kuò)展

  • 經(jīng)典形式
class LineItem1:
    def __init__(self, description, weight, price):
        self.description = description
        self.weight = weight
        self.price = price

    def subtotal(self):
        return self.weight * self.price

    def get_weight(self):
        return self.__weight

    def set_weight(self,value):
        if value > 0:
            self.__weight = value
        else:
            raise ValueError('weight必須大于0')

    weigth = property(get_weight,set_weight)
# 這種方法也是可以實(shí)現(xiàn)同樣的效果,在python中這種方法叫做經(jīng)典形式
# 說實(shí)話這個看著特別好理解,但是python用過語法糖@之后 發(fā)現(xiàn)好簡潔,就喜歡用@property了,大家只要知道這個方法就可以了。
# 我目前了解的就是這兩個,可能優(yōu)勢很多知識我沒體會出來,但是不妨礙我使用啊,等要用的時候再去查查
  • 屬性的覆蓋
class A:
    def __init__(self):
        self.a = 1
        self.b = 2

B = A()
print(B.a)
print(B.b)
print("-"*10)
B.a=10
print(B.a)
print(A().a)

1
2
----------
10
1
# 可以看出實(shí)例屬性會覆蓋(遮蓋可能更加好一點(diǎn),畢竟沒有把原本的數(shù)據(jù)改了)類屬性
# 下面在寫一個property特性的  看看會不會被遮蓋
  • 1

class A:
    def __init__(self):
        self.a = 1


    @property
    def data(self):
        return "i am superman"

1. B = A()
2. print(B.data)
3. print(vars(B))
4. B.__dict__['data'] = '2017'
5. print(vars(B))
6. print(B.data)
7. A.data="ppp"
8. print(B.data)
9. print(A.data)

i am superman
{'a': 1}
{'data': '2017', 'a': 1}
i am superman
2017
ppp
# 可以看到在我們執(zhí)行4的時候 返回的字典中多了data 的key
# 運(yùn)行6的時候任然看到"i am superman"->這個說明了特性沒有被實(shí)例屬性覆蓋
# 但是我現(xiàn)在銷毀了A中的property 直接給傳入值,B.data讀取的則是2017

總結(jié):是不是感覺好奇怪,我明明都已經(jīng)給B.dict['data']賦值了啊,為什么讀取的還是i am superman ,那和上面的例子不是沖突么。
說明下:如果實(shí)例屬性和類屬性同名的話會被覆蓋掉。xx.data 無論怎么說都會優(yōu)先去xx.class中讀取的。當(dāng)我把data(propery)銷毀之后,后面實(shí)例屬性給他賦值了2017 所以會讀取2017的

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 22年12月更新:個人網(wǎng)站關(guān)停,如果仍舊對舊教程有興趣參考 Github 的markdown內(nèi)容[https://...
    tangyefei閱讀 35,390評論 22 257
  • 喜歡聽音樂, 喜歡看花開花謝、草長鶯飛, 喜歡在大自然中奔跑, 喜歡在公園里聽著音樂, 隨著身體舞蹈, 抬手、舉過...
    香盈秀2013閱讀 274評論 2 3
  • 昨晚上看聊齋志異畫皮篇去了,一直看到23:47才看完。 從今天開始,22:40開始寫反思總結(jié),23:10之前必須睡...
    柒灬月流火閱讀 278評論 0 0
  • 當(dāng)前盛行的日系A(chǔ)CGN作品里經(jīng)常會出現(xiàn)身著女仆裝的人物角色,她們的出現(xiàn)為ACGN作品增添了劇情,同時也讓ACGN迷...
    奇天插畫原畫閱讀 2,188評論 0 0
  • 最近經(jīng)過一個朋友的項(xiàng)目推薦來到某公司的健康產(chǎn)品檢測區(qū),經(jīng)過工作人員簡單的介紹后,朋友滔滔不絕的跟我說起了所謂的人體...
    悟德AAA891閱讀 379評論 0 1

友情鏈接更多精彩內(nèi)容