@property 可以將python定義的函式「當做」屬性訪問,從而提供更加友好訪問方式,但是有時候setter/getter也是需要的,我們視具體情況吧
請注意以下**場景:
**片段1:
python2.6**
class parrot(object):
def __init__(self):
self._voltage = 100000
@property
def voltage(self):
"""get the current voltage."
""return self._voltage
if __name__ == "__main__":
# instance
p = parrot()
# similarly invoke "getter" via @property
print p.voltage
# update, similarly invoke "setter"
p.voltage = 12
**片段2:
python2.6**
class parrot:
def __init__(self):
self._voltage = 100000
@property
def voltage(self):
"""get the current voltage."
""return self._voltage
if __name__ == "__main__":
# instance
p = parrot()
# similarly invoke "getter" via @property
print p.voltage
# update, similarly invoke "setter"
p.voltage = 12
**1、2的區別在於
class parrot(
object):
在python2.6下,分別執行測試
片段1:將會提示乙個預期的錯誤資訊 attributeerror: can't set attribute
片段2:正確執行
參考python2.6文件,@property將提供乙個ready-only property,以上**沒有提供對應的@voltage.setter,按理說片段2**將提示執行錯誤,在python2.6文件中,我們可以找到以下資訊:
bif:
property([fget[, fset[, fdel[, doc]]]])
return a property attribute for new-style classes (classes that derive from object).
原來在python2.6下,內建型別 object 並不是預設的基類,如果在定義類時,沒有明確說明的話(**片段2),我們定義的parrot(**片段2)將不會繼承object
而object類正好提供了我們需要的@property功能,在文件中我們可以查到如下資訊:
new-style class
any class which inherits from object. this includes all built-in types like list and dict. only new-style classes can use python's newer, versatile features like __slots__,
descriptors,
properties, and __getattribute__().
同時我們也可以通過以下方法來驗證
python 2.6**
class a:
pass
>>type(a)
python 2.6**
class a(object):
pass
>>type(a)
從返回的,可以看出是我們需要的object型別(python 3.0 將object類作為預設基類,所以都將返回)
為了考慮**的python 版本過渡期的相容性問題,我覺得應該定義class檔案的時候,都應該顯式定義object,做為乙個好習慣
最後的**將如下:
python**
class parrot(object):
def __init__(self):
self._voltage = 100000
@property
def voltage(self):
"""get the current voltage."""
return
self._voltage
@voltage.setter
def voltage(self, new_value):
self._voltage = new_value
if __name__ == "__main__":
# instance
p = parrot()
# similarly invoke "getter" via @property
print p.voltage
# update, similarly invoke "setter"
p.voltage = 12
python教學筆記 python學習筆記(一)
1.eval 函式 eval是單詞evaluate的縮寫,就是 求.的值的意思。eval 函式的作用是把str轉換成list,dict,tuple.li 1 1,2,3 print eval li 1 di 1 print eval di 1 tu 1 2,4,6 print eval tu 1 執...
python學習筆記
coding utf 8 coding utf 8 應該像八股文一樣在每個指令碼的頭部宣告,這是個忠告 為了解決中文相容問題,同時你應該選擇支援 unicode 編碼的編輯器環境,保證在執行指令碼中的每個漢字都是使用 utf 8 編碼過的。cdays 5 exercise 3.py 求0 100之間...
Python 學習筆記
python 學習筆記 def run print running.def execute method method execute run result running.condition false test yes,is true if condition else no,is false ...