python中的@property

439 阅读2分钟

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)