property的作用是将一个属性的操作方法封装为一个属性,用户使用起来就和操作普通属性完全一致。
property属性有两种使用方式:
装饰器 :在方法上应用装饰器
类属性:在类中定义值为property对象的类属性。
首先看装饰器的方式:
我们要首先明白python中有经典类和新式类,新式类的属性比经典类属性丰富(如果类继承object,那么该类是新式类,python3中默认所有类为新式类)。
关于property属性要知道经典类中属性只有一种访问方式,@property 。新式类中的属性有三种访问方式:@property , @方法名.setter , @方法名.deleter
由于新式类具有三种访问方式,我们可以根据他们几个属性的访问特点,分别将三个方法定义为对同一个属性:获取、修改、删除。
class Goods(object):
def __init__(self):
# 原价
self.original_price = 100
# 折扣
self.discount = 0.8
@property
def price(self):
# 实际价格 = 原价 * 折扣
new_price = self.original_price * self.discount
return new_price
@price.setter
def price(self, value):
self.original_price = value
@price.deleter
def price(self):
del self.original_price
obj = Goods()
obj.price # 获取商品价格
obj.price = 200 # 修改商品原价
del obj.price # 删除商品原价
接下来看类属性方式,创建值为property对象的类属性。
当使用类属性的方式创建property属性时,经典类和新式类无区别。当调用操作属性的方法时,直接使用该类属性名。
property方法中有个四个参数 (参数顺序不能改变,无此函数时参数为None)
- 第一个参数是方法名,调用 对象.属性 时自动触发执行方法
- 第二个参数是方法名,调用 对象.属性 = XXX 时自动触发执行方法
- 第三个参数是方法名,调用 del 对象.属性 时自动触发执行方法
- 第四个参数是字符串,调用 类名.属性.__doc__ ,此参数是该属性的描述信息
class Goods(object):
"""这是一个商品价格类"""
def __init__(self):
self.original_price = 100
self.discount = 0.8
def get_price(self):
my_price = self.original_price * self.discount
return my_price
# 必须两个参数
def set_price(self, value):
self.original_price = value
def del_price(self):
del self.original_price
price = property(get_price, set_price, del_price, "调整商品价格")
# 少参数时的处理方法
#price = property(get_price, None, del_price, "调整商品价格")
goods = Goods()
print(goods.price) # 获取价格
goods.price = 200 # 修改价格
print(goods.price)
print(Goods.price.__doc__) # 获取price 类属性描述信息 调整商品价格
print(Goods.__doc__) # 获取类的描述信息
print(goods.__doc__) # 获取Goods对象的描述信息
del goods.price # 删除价格
# print(goods.price)
80.0
160.0
调整商品价格
这是一个商品价格类
这是一个商品价格类