修改與刪除@property封裝的數據屬性
阿新 • • 發佈:2018-08-14
peer new 報錯 pri 寫法 屬性 delet 裝飾 tee
# 修改與刪除@property封裝的數據屬性 # 原始通過@property實現的功能:將類中定義的函數屬性,通過裝飾器@property將其封閉成數據屬性,這時是不能刪除和修改這個數據屬性的 class Room: def __init__(self, name, width, length): self.name = name self.width = width self.length = length @property def area(self): return self.width * self.length r1= Room(‘廚房‘, 10, 4) print(r1.area) r1.area = 100 # AttributeError: can‘t set attribute del r1.area # AttributeError: can‘t delete attribute # @property補充,可以修改和刪除封裝後的屬性 class Goods: def __init__(self): self.original_price = 100 # 原價 self.discount = 0.8 # 折扣 @property # 這個必須放在setter和deleter的前面,否則不能修改下面的兩種方法def price(self): new_price = self.original_price * self.discount # 實際價格=原價*折扣 return new_price @price.setter def price(self, value): self.original_price = value @price.deleter def price(self): del self.original_price obj = Goods() print(obj.price) #獲取價格 obj.price = 200 # 修改原價 print(obj.price) del obj.price # 刪除原價 # 以上的寫法也可以這樣寫 class Goods: def __init__(self): self.original_price = 100 # 原價 self.discount = 0.8 # 折扣 def get_price(self): new_price = self.original_price * self.discount # 實際價格=原價*折扣 return new_price def set_price(self, value): self.original_price = value def del_price(self): del self.original_price price = property(get_price, set_price, del_price) # 順序必須為get、set、del obj = Goods() print(obj.price) # 獲取價格 obj.price = 200 # 修改原價 print(obj.price) del obj.price # 刪除原價 # 用@property實現的數據類型檢測 class People: def __init__(self, name): self.name = name # 實例化就觸發property @property def name(self): # return self.name #無限遞歸 return self.newname @name.setter def name(self, value): if not isinstance(value, str): raise TypeError(‘名字必須為字符串‘) self.newname = value @name.deleter def name(self): del self.newname p1 = People(‘張三‘) # self.name實際是存放到self.newname中 p1.name = 1 # 這裏就會報錯
修改與刪除@property封裝的數據屬性