作用:
使一个方法调用起来像调用属性一样,简化调用者在获取数据的流程,使代码更整洁。
两种方式实现property属性
1、装饰器:在方法上应用装饰器
- python2中只有@property一种修饰方法
- python3中有@property、@方法名.setter、@方法名.deleter三种修饰方法,分别实现获取、修改和删除
class Bus:
def __init__(self):
# 票价
self.price = 2
# 收入
self.revenue = 200
@property
def passage_no(self):
value = self.revenue / self.price
return value
@passage_no.setter
def passage_no(self, num):
self.revenue = num
@passage_no.deleter
def passage_no(self):
del self.revenue
bus = Bus()
print(bus.passage_no) # 计算乘客数量
bus.passage_no = 60 # 修改乘客数计算收入
print(bus.passage_no)
del bus.passage_no # 收入清零
注意:
- 这个三个方法的方法名必须都是一样的
- 第一个装饰器@property不能省
- @property要写在@revenue.setter和@revenue.deleter前面,
- 调用bus.revenue时不要加括号
bus.revenue()
2、类属性:在类中定义值为property对象的类属性
property方法中有4个参数:
property(fget=None, fset=None, fdel=None, doc=None)
- fget:function to be used for getting an attribute value
- fset:function to be used for setting an attribute value
- fdel:function to be used for del'ing an attribute
- doc:docstring
class Bus:
def __init__(self):
# 票价
self.price = 2
# 收入
self.revenue = 200
def get_passage_no(self):
value = self.revenue / self.price
return value
def set_passage_no(self, num):
self.revenue = num
def del_passage_no(self):
del self.revenue
PRO = property(get_passage_no, set_passage_no, del_passage_no, "==============")
bus = Bus()
print(bus.PRO) # 计算乘客数量
bus.PRO = 60 # 修改乘客数计算收入
print(bus.PRO)
print(Bus.PRO.__doc__)
del bus.PRO # 收入清零
property属性在创建类时,可以使用方法间接访问私有化属性,完成类似权限验证等功能,这样在实例化后仍然是以访问属性的方式访问私有化属性。