python3中@property属性的使用

137 阅读1分钟
#!/usr/bin/python
# -*- coding:utf-8 -*-

"""
定义时:在实例方法的基础上添加@property装饰器 并且仅有一个self参数
调用时:无需括号
python的property属性的功能:property属性内部进行一系列逻辑计算最终将计算结果返回

"""


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(1)
p.start
p.end

"""
property属性的两种方式
1. 装饰器:在实例方法上应用装饰器
2. 类属性:在类中定义值为property对象的类属性
"""

class Goods(object):
    """
    新式类:python3中才有setter和deleter的功能
    """

    def __init__(self) -> None:
        self.oriinal_price = 100
        self.discount = 0.8

    @property
    def price(self):
        #实际价格 = 原价* 折扣
        new_price = self.oriinal_price * self.discount
        return new_price
    
    @price.setter
    def price(self,value):
        self.oriinal_price = value

    @price.deleter
    def price(self):
        del self.original_price


obj = Goods()
#获取商品价格
obj.price
#修改商品原价
obj.price = 120
#删除商品原价
del obj.price


class Foo(object):

    def get_bar(self):
        return "get_bar"

    def set_bar(self,value):
        #必须两个参数
        return "set value" + value

    def del_bar(self):
        return "del bar"
    
    #property方法中有四个参数
    bar = property(get_bar,set_bar,del_bar,"__doc__")
    

obj = Foo()

obj.bar
obj.bar = "重置bar的值"
del obj.bar
#获取文档信息
desc = Foo.bar.__doc__