property是一种特殊的属性,访问它时会执行一段功能(函数)然后返回值
将一个类的函数定义成特性以后,对象再去使用的时候obj.name,根本无法察觉自己的name是执行了一个函数然后计算出来的,这种特性的使用方式遵循了统一访问的原则
class People:
def __init__(self,name,weight,height):
self.__name = name
self.weight = weight
self.height = height
# @property # 一个装饰器
def bmi(self):
return self.weight/(self.height**2)
people = People('夏天',62,1.68)
print(people.bmi) # 加了property装饰器后函数调用方式变化,不用加括号。可以像访问数据属性一样访问函数属性
# property装饰的函数必须要有返回值,其使用于需要的数据要通过计算得到的场景
在定义一个类里面的函数属性后,不可以直接对函数进行赋值、删除等操作。
class People:
def __init__(self,name,weight,height):
self.__name = name
self.weight = weight
self.height = height
@property
def name(self):
return self.__name
@name.setter # 函数添加修改类型的装饰器
def name(self,val):
print('setter',val)
if not isinstance(val,str):
print('名字必须是字符串')
return
self.__name = val
@name.deleter # 函数添加删除类型的装饰器
def name(self):
print('不允许删除')
people = People('夏天',62,1.68)
print(people.name) # 查询操作
people.name = '田' # 赋值操作
people.name = 123
del people.name # 删除操作
print(people.name)
# 注意在用@name.setter 和 @name.deleter对函数属性进行装饰时,必须提前用@property装饰相应的函数