装饰器《三》 property - 复杂逻辑
原创
©著作权归作者所有:来自51CTO博客作者风华浪浪的原创作品,请联系作者获取转载授权,否则将追究法律责任
一、 property装饰器
property负责装饰一个对象函数,让其生成对应的setter和getter函数,调用的时候可以直接使用对象名.函数名 函数名不加括的形式,这种类似属性的调用方式来执行函数(创建可管理对象属性)
- property属性内部进行一系列的逻辑计算,将计算结果返回
- 为函数添加@property装饰器可以使得函数像变量一样访问
- 检查参数]
- -我们在对实例属性操作的时候,如果属性很可能不是直接暴露的,为私有属性,通过getter和setter方法来实现的。setter装饰的函数, 可以向该函数中传递参数
-
简单逻辑运算
通过调用@property装饰的number函数获取私有属性值
通过调用@number.setter装饰的number函数,设置私有属性
定义只读属性,只定义getter方法,不定义setter方法就是一个只读属性
from datetime import date
class Monkey(object):
def __init__(self, new_name, term, height):
self.name = new_name
self.term = term
self.__height = height
@property
def height(self): 取某些数据,无参数
return self.__height 一定要是私有属性, 只读属性
@height.setter 验证参数
def height(self, value):
if not isinstance(value, int):
self.__height = value
if __name__ == '__main__':
monkey = Monkey('wukong', 500, 99)
lock_up = monkey.height 对象.函数名
print(lock_up)
monkey.height = 200 setter 对象.函数名 = 参数值 用来设置验证某些数据
height = monkey.height
print(height)
monkey.height 调用的是 @property
monkey.height = 200 调用的是 @height.setter
-
简单逻辑运算
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 # 获取商品价格 80
obj.price = 200 # 修改商品原价 200 * 0.8 = 160
del obj.price # 删除商品原价 删除之后在打印,报错啦
-
校验参数
对象有一个age属性,在给age属性赋值时,只能赋予整数类型的值,如果不是整数,抛出异常
class Student(object):
def __init__(self, age):
self.age = age
@property
def age(self):
return self._age
@age.setter
def age(self, value):
if not isinstance(value, int):
raise TypeError('age must be int number!')
self._age = value
if self._age >= 18:
print('you are adult!')
else:
print('you are teenager!')
stu = Student(18)
stu.age = 15
print(stu.age)