Python支持高阶函数,可以用装饰器函数把 get/set 方法“装饰”成属性调用
1、定义property属性共有两种方式,分别是装饰器和类属性,而装饰类方式针对经典类和新式类又有所不同
2、通过使用property属性,能够简化调用者在获取数据的流程
property调用类的属性


property的另外一种使用场景
"""
需求:
对于京东商城中显示电脑主页的列表页面,每次请求不可能把数据中所有的内容都显示
在页面上,而是通过分页的功能局部显示,所以在向数据库中请求数据时就要显示指定第m
条到第n条的所有数据,这个分页的功能包括
1、根据用户请求当前页和总数据条数计算出m和n
2、根据m和n去数据中取数据
而使用property属性就可以满足需求
直接函数调用start和end就可以知道取的开始页还有结束页
"""
class Pager:
def __init__(self, current_page):
self.current_page = current_page
# 规定每一页的个数
self.per_items = 10
@property
def start(self):
val = (self.current_page-1)*self.per_items
return val
@property
def end(self):
val = self.current_page*self.per_items
return val
p = Pager(2)
print(p.start)
print(p.end)

property在get和setter上体现
class Goods:
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()
print(obj.price)
# 改变原价,相当于使用setter
obj.price = 200
print(obj.price)
# 直接删除
del obj.price
property()方法的使用
class Goods:
def __init__(self):
# 原价
self.original_price = 100
# 折扣
self.discount = 0.8
def price(self):
new_price = self.original_price*self.discount
return new_price
def price_set(self, value):
self.original_price = value
def price_del(self):
del self.original_price
# property三个参数:
"""
1、第一个参数是方法名,调用对象.属性的时候自动触发执行方法
2、第二个参数是方法名,调用对象.属性=XXX时自动触发执行方法
3、del
4、文档描述
"""
property_method = property(price, price_set, price_del, "这里是类的描述性词语")
obj = Goods()
print(obj.property_method)
obj.property_method = 200
print(obj.property_method)
# 这里使用的是Goods,而不是obj
decript = Goods.property_method.__doc__
print(decript)
