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)     # 因为删了,所以报错


从前慢  ---  洪尘

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值