方法属性装饰器 本质上来说就是将方法的执行括号去掉,这样将一个方法掩饰成了一个变量名字,变成了类似属性的东西 内置装饰器函数,只在面向对象中使用
1 from math import pi 2 class Cricle: 3 def __init__(self,r): 4 self.r = r 5 @property 6 def perimeter(self): 7 return 2*pi*self.r 8 @property 9 def area(self):10 return pi*self.r**211 12 c1 = Cricle(5)13 14 print(c1.perimeter) # 伪装成一个变量,变成一个属性15 # print(c1.perimeter()) # 之前的实现方式16 print(c1.area)17 # print(c1.area())
既然是属性能不能改呢~ 很明显是不能的
1 class Person: 2 def __init__(self,name,high,weight): 3 self.name = name 4 self.high = high 5 self.weight = weight 6 @property 7 def bmi(self): 8 return self.weight / self.high ** 2 9 suyang = Person("苏阳",1.5,180)10 # print(suyang.bmi()) # 原先的调用方式11 print(suyang.bmi) # 80.012 suyang.name = "sb"13 # suyang.bmi = 18 # 既然是属性,改改试试?.14 # AttributeError: can't set attribute # 毕竟特么不是属性,本质上是方法啊
property 的实际用例
商品打折 不让用户知道真实的价格只能看到打折后的价格
1 class Goods: 2 discount = 0.5 # 打折力度 5折 3 def __init__(self,name,price): 4 self.name = name 5 self.__price = price # 我才不会让别人知道我的价格 6 @property 7 def price(self): 8 return self.__price * Goods.discount 9 10 apple = Goods("苏阳",0.5) 11 print(apple.price)
补充: 修改属性 @ name.setter,将原有的属性进行更改替换
1 class Person: 2 def __init__(self,name): 3 self.__name = name 4 @property 5 def name(self): 6 return self.__name +"sb" 7 @name.setter # 一般很难用到,计算出来的值一般是直接用不需要再处理了 8 def name(self,new_name): 9 self.__name = new_name10 suyang = Person("苏阳")11 print(suyang.name) # 苏阳sb12 suyang.name = "suyang"13 print(suyang.name) # suyangsb