1. 程式人生 > >修改與刪除@property封裝的數據屬性

修改與刪除@property封裝的數據屬性

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封裝的數據屬性