Python高级之property属性

概念

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

class Foo(object):
    def __init__(self):
        self.name="张三"

    @property
    def prop(self):
        print("property属性")
        return "xxx"
    
    def fun(self):
        print("普通方法")
        return "yyy"


# 构建实例对象
foo = Foo()
print(foo.name) # 使用实例属性
foo.fun()  # 使用普通方法
print(foo.prop) # 使用property属性

功能

property属性内部进行一系列的逻辑计算,最终将计算结果返回

好处

以下通过三种方式来修改一个商品的价格,对比出property属性的好处

传统方式1:在外部直接修改实例属性

class Goods(object):
    def __init__(self):
        self.price=4000

goods = Goods()
goods.price = 2000
goods.price = 200a

缺点:

  • 有没有资格修改
  • 输入的数据不好验证

传统方式2:通过方法来取得实例属性的值和设置实例属性

class Goods(object):
    def __init__(self):
        self.__price=4000  # 私有属性

    def get_price(self):
        # 身份验证
        # 其他的业务
        print("get_price")
        return self.__price

    def set_price(self,new_price):
        # 身份验证
        # 数据验证
        print("set_price")
        try:
            self.__price=int(new_price)
        except:
            print("修改价格失败")
            
            
goods=Goods()
goods.set_price(1600)  # 设置实例属性值
print(goods.get_price())  # 取得实例属性值

缺点:

  • 方法名可以随意设置
  • 还是需要调用方法

通过property属性方式来设置实例属性

class Goods(object):
    def __init__(self):
        self.__price=4000  # 私有属性

    @property
    def price(self):
        # 身份验证
        # 其他的业务
        print("get_price")
        return self.__price

    @price.setter
    def price(self,new_price):
        # 身份验证
        # 数据验证
        print("set_price")
        try:
            self.__price=int(new_price)
        except:
            print("修改价格失败")
            
            
# 使用property属性的访问
p_goods = Goods()
print(p_goods.price)  # 获取property属性值
p_goods.price=2600 # 设置property属性值
print(p_goods.price)  # 获取property属性值

好处:

  • 将一个属性的操作方法封装为一个属性,用户用起来就和操作普通属性完全一致,非常简单。

定义

1.通过装饰器的方式来定义

在实例方法的基础上添加@property装饰器,并且方法仅有一个self参数

  • 获取属性
@property
def 方法名(self):
  • 设置属性(不定义setter方法就是一个只读属性)
@property.setter
def 方法名(self, 参数):
  • 删除属性(几乎不用)
@property.deleter
def 方法名(self):

demo:

class Goods(object):
    def __init__(self):
        self.__price=4000 # 实例属性,私有属性

    @property
    def price(self):
        # 身份验证
        # 其他的业务
        print("取值: @property")
        return self.__price

    @price.setter
    def price(self,new_price):
        # 身份验证
        # 数据验证
        print("修改值: @price.setter")
        try:
            self.__price=int(new_price)
        except:
            print("修改价格失败")


    @price.deleter
    def price(self):
        print("删除:@price.deleter")

# 访问property属性的方式
p_goods = Goods()
print(p_goods.price)  # 获取价格
p_goods.price=600  # 设置价格
print(p_goods.price)  # 获取价格
del p_goods.price  # 删除价格
print(p_goods.price)  # 获取价格
2.通过装饰器的方式来定义
  1. 首先需要在类中定义三个对应的方法

  2. 定义类属性=property(方法名1,方法名2,方法名3,“字符串”)

    第一个参数是方法名: 获取属性值
    第二个参数是方法名: 设置属性值
    第三个参数是方法名: 删除属性
    第四个参数是字符串: 该属性的描述信息,通过类名.属性名.__doc__调用

demo:

class Goods(object):
    def __init__(self):
        self.__price=4000  # 私有属性

    def get_price(self):
        # 身份验证
        # 其他的业务
        print("get_price")
        return self.__price

    def set_price(self,new_price):
        # 身份验证
        # 数据验证
        print("set_price")
        try:
            self.__price=int(new_price)
        except:
            print("修改价格失败")

    def del_price(self):
        print("del_price")

    price=property(get_price,set_price,del_price,"商品价格信息")


# 使用property属性的访问
p_goods = Goods()
print(p_goods.price)  # 获取价格
p_goods.price=1000 # 设置价格
print(p_goods.price)  # 获取价格
del p_goods.price  # 删除价格
print(p_goods.price)  # 获取价格
print(Goods.price.__doc__)  # 返回属性说明字符串
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值