property

一、property
@property 把一個方法 僞裝成一個屬性
1.屬性的值 是這個方法的返回值
2.這個方法不能有參數了
吶:(圓的小栗子)
from math import pi
class Circle:
    def __init__(self,r):
        self.r = r
    @property
    def area(self):
        return self.r*self.r*pi
    @property
    def perimeter(self):
        return self.r*pi*2
c1 = Circle(5)
print(c1.area)        # 就是沒有括號了而已
print(c1.perimeter)
吶2:
class Person:
    def __init__(self,name,height,weight):
        self.name = name
        self.height = height
        self.__weight = weight
    @property
    def bmi(self):
        return self.__weight / (self.height ** 2)
li = Person('sunv',1.75,85)
# print(li.bmi())    # 報錯,不能加括號了,已變成屬性,不再是方法
print(li.bmi)        #27.76
二、私有 + property
class Goods:
    __discount = 0.8   #靜態屬性
    def __init__(self,name,price):
        self.__name = name
        self.__price = price  # 原價
  @property
    def price(self):   # 折後價
        return self.__price * Goods.__discount
    @price.setter
    def price(self,new_price):   #修改原價 這裏只能傳一個參數(new_price)
        self.__price = new_price
apple = Goods('蘋果',10)
apple.price = 9   #settrt   有了settrt 就可以 改屬性了,成真屬性了
print(apple.price)   #property
升級版:
class Goods:
    __discount = 0.8   #靜態屬性
    def __init__(self,name,price):
        self.__name = name
        self.__price = price  #原價
    @property
    def name(self):
        return self.__name
    @name.setter
    def name(self,new_name):
        self.__name = new_name
    @property
    def price(self):   #折後價
        return self.__price * Goods.__discount
    @price.setter
    def price(self,new_price):   #修改原價
        if type(new_price) is int:
            self.__price = new_price
apple = Goods('蘋果',10)
apple.price = 9   #settrt     # 有了settrt 就可以 改屬性了,成真屬性了
print(apple.price)   #property     # 7.2
apple.name = '富士'
print(apple.name)        # 富士
NA:
封裝
__私有+property
讓對象的屬性變得更安全了
獲取到的對象的值可以進行一些加工
修改對象的值的同時可以進行一些驗證
AI理解理解:
class Foo:
    @property
    def AAA(self):
        print('get的時候運行我啊')
    @AAA.setter
    def AAA(self,value):
        print('set的時候運行我啊')
    @AAA.deleter   
    def AAA(self):
        print('delete的時候運行我啊')
#只有在屬性AAA定義property後才能定義AAA.setter,AAA.deleter
f1=Foo()
f1.AAA         #property    # get的時候運行我啊
f1.AAA='aaa'  #setter     # set的時候運行我啊 一這樣就觸發setter
del f1.AAA    #deleter    #  delete的時候運行我啊
加上deleter之後:
class Goods:
    __discount = 0.8   #靜態屬性
    def __init__(self,name,price):
        self.__name = name
        self.__price = price  #原價
    @property
    def name(self):
        return self.__name
    @name.setter
    def name(self,new_name):
        self.__name = new_name
    @name.deleter                          # 若沒有deleter 則下面的調用就會報錯!
    def name(self):                          # AttributeError: can't delete attribute
        del self.__name
    @property
    def price(self):   #折後價
        return self.__price * Goods.__discount
    @price.setter
    def price(self,new_price):   #修改原價
        if type(new_price) is int:
            self.__price = new_price
apple = Goods('蘋果',10)
# del apple.name
print(apple.name)     # 因爲刪了,所以報錯


從前慢  ---  洪塵

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章