方法属性装饰器
本质上来说就是将方法的执行括号去掉,这样将一个方法掩饰成了一个变量名字,变成了类似属性的东西
内置装饰器函数,只在面向对象中使用
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**2
11
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.0
12 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_name
10 suyang = Person("苏阳")
11 print(suyang.name) # 苏阳sb
12 suyang.name = "suyang"
13 print(suyang.name) # suyangsb