3.1.8 property裝飾器
阿新 • • 發佈:2018-05-31
highlight In 字符串類型 return 調用 .get 必須 prope setter
在類的方法上加上一行@property 裝飾器,會使得用戶調用該函數屬性時,就像調用數據屬性一樣,不需要加上()
比如想獲取一些名詞,再加上括號,容易使調用者忘記。動詞才加()調用方法.
如下示例:
‘‘‘
BMI指數(bmi是計算而來的,但很明顯它聽起來像是一個屬性而非方法,如果我們將其做成一個屬性,更便於理解)
成人的BMI數值:
過輕:低於18.5
正常:18.5-23.9
過重:24-27
肥胖:28-32
非常肥胖, 高於32
體質指數(BMI)=體重(kg)÷身高^2(m)
EX:70kg÷(1.75×1.75)=22.86
‘‘‘
class People: def __init__(self,name,weight,height): self.name=name self.weight=weight self.height=height @property def bmi(self): return self.weight / (self.height ** 2) p=People(‘egon‘,75,1.81) # p.bmi=p.weight / (p.height ** 2) # print(p.bmi) #使用數據屬性不需要加() # # print(p.bmi()) #沒加@property裝飾器時,調用p.bmi()是需要加括號的 # print(p.bmi) #加上@property裝飾器後,調用p.bmi()可以不加括號。 # p.height=1.82 # print(p.bmi) #p.bmi值會隨著height的變化而變化。 p.bmi=3333 #報錯AttributeError: can‘t set attribute
以下是需要了解的內容:
要怎麽才能修改被@property裝飾的屬性呢?
@name.setter @name.deleter name是被@property修飾過的方法名
設置name時觸發setter
刪除name時觸發deleter
getname時@property
class People: def __init__(self,name): self.__name=name @property def name(self): # print(‘getter‘) #p.name時觸發該方法 return self.__name @name.setter def name(self,val): #p.name = ‘EGON‘ 時觸發該方法 # print(‘setter‘,val) if not isinstance(val,str): print(‘名字必須是字符串類型‘) return self.__name=val @name.deleter def name(self): # del p.name時觸發該方法 print(‘deleter‘) print(‘不允許刪除‘) p=People(‘egon‘) # print(p.get_name()) # print(p.name) # p.name # p.name=‘EGON‘ # p.name=123 # print(p.name) del p.name
3.1.8 property裝飾器