python學習筆記 property

2021-06-09 07:25:45 字數 2736 閱讀 3339

@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 ...