举个栗子引入property属性
# 定义
class Goods:
def size1(self):
return 100
@property
def size2(self):
return 100
# 调用
obj = Goods()
ret1 = obj.size1() # 调用非property方法
ret2 = obj.size2 # 调用property属性
print(ret1) # 结果100
print(ret2) # 结果100
1.property属性定义
一种用起来像是使用的实例属性一样的特殊属性,可以对应于某个方法,通过使用property属性,能够简化调用者在获取数据的流程。
注意:
1.定义时,在实例方法的基础上添加@property装饰器
2.仅有一个self参数
3.定义时,必须有return值
4.调用时,不能传参,不能写括号
2.property属性的两种方法
2.1.第一种方法(装饰器)
class Goods:
def __init__(self):
self.apple_price = 100
self.discount = 0.8
@property # 定义
def price(self):
print("已获取")
return self.apple_price * self.discount
@price.setter # 修改
def price(self, value):
self.apple_price = value
print("已修改")
@price.deleter # 删除
def price(self):
del self.apple_price
print("已删除")
obj = Goods()
print(obj.price)
print("----------")
obj.price = 200
print("----------")
print(obj.price)
print("----------")
del obj.price
'''运行结果如下'''
已获取
80.0
----------
已修改
----------
已获取
160.0
----------
已删除
2.2.第二种方法(类属性)
property()方法有四个参数
第一个参数是方法名,调用 对象.属性 时自动触发执行方法
第二个参数是方法名,调用 对象.属性 = XXX 时自动触发执行方法
第三个参数是方法名,调用 del 对象.属性 时自动触发执行方法
第四个参数是字符串,调用 对象.属性._doc_ ,此参数是该属性的描述信息
class Foo:
def get_bar(self):
return 123
def set_bar(self, value):
print("修改")
def del_bar(self):
print("删除")
BAR = property(get_bar, set_bar, del_bar, "文档说明")
obj = Foo()
print(obj.BAR)
obj.BAR = 100
del obj.BAR
print(Foo.BAR.__doc__)
3.property应用
class Cat:
def __init__(self, age):
self.__age = age
def getAge(self):
return self.__age
def setAge(self, age):
self.__age = age
age = property(getAge, setAge)
cat = Cat(10)
print(cat.age) # 自动调用cat.getAge()
cat.age = 20 # 自动调用cat.setAge(20)
print(cat.age) # 自动调用cat.getAge()
'''
结果:
10
20
'''