property

来源:互联网 发布:南风知我意1七微百度云 编辑:程序博客网 时间:2024/06/14 15:58
一、property
@property把一个方法 伪装成一个属性
1.属性的值 是这个方法的返回值
2.这个方法不能有参数了
呐:(圆的小栗子)
from math import piclass 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*2c1 = 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_priceapple = 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_priceapple = Goods('苹果',10)apple.price = 9   #settrt     # 有了settrt 就可以 改属性了,成真属性了print(apple.price)   #property     # 7.2apple.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.deleterf1=Foo()f1.AAA         #property    # get的时候运行我啊f1.AAA='aaa'  #setter     # set的时候运行我啊 一这样就触发setterdel 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_priceapple = Goods('苹果',10)# del apple.nameprint(apple.name)     # 因为删了,所以报错


从前慢  ---  洪尘

原创粉丝点击