property属性的使用

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
调整商品价格
这是一个商品价格类
这是一个商品价格类

猜你喜欢

转载自blog.csdn.net/w18306890492/article/details/82899251