概念
一种用起来像是使用的实例属性一样的特殊属性,可以对应于某个方法,本质还是方法
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.通过装饰器的方式来定义
-
首先需要在类中定义三个对应的方法
-
定义类属性=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__) # 返回属性说明字符串