Python-property 属性

Python 的 property 属性,一种用起来像是使用实例属性一样的特殊属性,可以对应于某个方法。

class Animal:
    @property
    def size(self):
        return 1000

animal = Animal()
rsize = animal.size  #调用属性
print(rsize)

property 属性的定义和调用要注意:
- 定义时,在实例方法的基础上添加 @property 装饰器,并且仅有一个 self 参数
- 调用时,无需括号

class Pager:
    def __init__(self, current_page):
        #用户当前请求的页码(第1页、第2页...)
        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)

Python 的 property 属性的功能是: property 属性内部进行一系列的逻辑计算,最终将计算结果返回。

property 属性的两种方式

  1. 装饰器,即在方法上应用装饰器
  2. 类属性,在类中定义值为 property 对象的类数属性

装饰器方式

在类的实例方法上应用 @property 装饰器 Python 中的类有经典类(出现在 Python2 中)和新式类 (继承 object 的类)。 经典类中具有一种 @property 装饰器,如上面的 Animal 类所示。而在新式类中,具有三种 @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

goods = Goods()
print(goods.price) #获取商品价格, 输出 80.0
goods.price = 200 #修改商品原价
print(goods.price) #输出 160.0
del goods.price  #删除商品原价

类属性方式

当使用类属性的方式创建 property 属性时,经典类和新式类没有区别

class Animal:
    def get_size(self):
        return 1000
    size = property(get_size)
animal = Animal()
rsize = animal.size  #自动调用 get_size 方法,并获取方法的返回值
print(rsize)

property 方法中有四个参数

class Goods: 
    def __init__(self): 
        #原价 
        self.original_price = 100.0
        #折扣
        self.discount = 0.8
    def get_price(self): 
        new_price = self.original_price * self.discount 
        return new_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, 'description...') 

goods = Goods() 
print(goods.price) #自动调用第一个参数的 get_price 方法,并获取方法的返回值, 获取商品价格
goods.price = 200 #自动调用第二个参数定义的方法 set_price 并将 200 当作参数传入
print(goods.price) #输出 160.0
print(Goods.price.__doc__ ) #自动获取第四个参数设置的值
del goods.price  #自动调用第三个参数定义的 del_price 方法, 删除商品原价

property 属性的应用

property 可以重新实现一个属性的设置和读取方法,可以用作边界判定

class Animal:
    def __init__(self):
        self.__size = 0
    @property
    def size(self):
        return self.__size
    @size.setter
    def size(self, value):
        if isinstance(value, int) and value > 0:
            self.__size = value
        else:
            print("error:不是整型,或者小于等于0")

a = Animal()
a.size = 10
print(a.size)
a.size = 0  #输出 error:不是整型,或者小于等于0

原创文章,转载请注明出处:https://www.daiyufish.com/article/python3-property/