python中有裝飾器的概念,@property是裝飾器的一種。
以下面的例子進行說明:
私有屬性以雙下劃線__開頭:外部不可通過instance.property來訪問或者更改。如果一定要,可以通過setname(),getname()等方法實現,可是這樣不簡潔。
但是,使用@property
可以優雅的對私有屬性 __amt 進行訪問。
acc.amount
使用@amount.setter
可以優雅的對私有屬性 __amt 進行更改。還能擴充套件功能,比如增加過濾條件。
acc.amount =
20
#!/usr/bin/env python3
class
account
(object):
"""賬號類,
amount 是美元金額.
"""def__init__
(self, rate)
: self.__amt =
0 self.rate = rate
@property
defamount
(self)
:"""賬號餘額(美元)"""
return self.__amt
@property
defcny
(self)
:"""賬號餘額(人民幣)"""
return self.__amt * self.rate
@amount.setter
defamount
(self, value)
:if value <0:
print
("sorry, no negative amount in the account."
)return
self.__amt = value
if __name__ ==
'__main__'
: acc = account(rate=
6.6)
# 基於編寫時的匯率
acc.amount =
20print
("dollar amount:"
, acc.amount)
print
("in cny:"
, acc.cny)
acc.amount =
-100
print
("dollar amount:"
, acc.amount)
如和快速理解property
一種用起來像是使用的例項屬性一樣的特殊屬性,可以對應於某個方法,通過使用property屬性,能夠簡化呼叫者在獲取資料的流程。定義時,在例項方法的基礎上新增 property 裝飾器 並且僅有乙個self引數 呼叫時,無需括號,加上就錯了 經典類中的屬性只有一種訪問方式,其對應被 property ...
Property和例項變數(Ivar)的最佳實踐
property應該代表乙個物件的狀態,getter應該沒有外部影響 它們可以具有內部影響,例如caching,但那些應該是呼叫者不可見的 避免直接訪問例項變數,使用accessor來代替。在早期的arc裡,引起bug最常見的原因就是直接訪問例項變數。開發者沒有正確的retain和release例項...
關於OC的property 和 例項變數思考
區別一 property的是可以被外部訪問的,當然也可以定義私有的property,但是例項變數,外部是不可訪問的。所以當我們的變數需要給外部訪問的時候,可以定義property。區別二我們需要儲存我們的資料,不要被提前dealloc的時候,可以使用property的setter,來retain多一...