一、 property装饰器

property负责装饰一个对象函数,让其生成对应的setter和getter函数,调用的时候可以直接使用对象名.函数名 函数名不加括的形式,这种类似属性的调用方式来执行函数(创建可管理对象属性)

  • property属性内部进行一系列的逻辑计算,将计算结果返回
  • 为函数添加@property装饰器可以使得函数像变量一样访问
  • 检查参数]
  • -我们在对实例属性操作的时候,如果属性很可能不是直接暴露的,为私有属性,通过getter和setter方法来实现的。setter装饰的函数, 可以向该函数中传递参数
  1. 简单逻辑运算​ 通过调用@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
  1. 简单逻辑运算
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 # 删除商品原价 删除之后在打印,报错啦
  1. 校验参数​ 对象有一个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)