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的