1. 程式人生 > >3.1.8 property裝飾器

3.1.8 property裝飾器

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裝飾器