一、
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) # 因为删了,所以报错
从前慢 --- 洪尘