property是一种特殊的属性,访问它时会执行一段功能(函数)然后返回值
class Person:
def __init__(self,name,height,weight):
self.name = name
self.__height = height
self.__weight = weight
@property # 装饰,将bim方法伪装成一个属性
def bmi(self):
return "%s的BMI指数是%s" %(self.name,self.__weight / self.__height ** 2)
p = Person("alex",1.8,70)
print(p.bmi) #装饰伪装成一个属性 之后输出打印不必写 p.bmi()
为什么要用property
将一个类的函数定义成特性以后,对象再去使用的时候obj.name,根本无法擦觉自己
的name是执行了一个函数然后计算出来的,这种特性的使用方式遵循l统一访问的原则
由于新式类中具有三种访问方式,我们可以根据他们几个属性的访问特点,分别将三个方法定义为
同一属性:获取,修改,删除
class Person:
def __init__(self,name,age):
self.name = name
if type(age) is int: #判断年龄输入是否是数字
self.__age = age
else:
print("输入有误")
@property
def age(self): #获取属性
return self.__age
@age.setter # 修改属性
def age(self,a1):
if type(a1) is int:
self.__age = a1
else:
print("输入有误")
@age.deleter # 删除属性
def age(self):
del self.__age
print(66)
p1 = Person("alex",20)
# print(p1.age) #或取属性,直接调用
# p1.age = 40 # 修改属性
# print(p1.__dict__) # 内部被修改{'name': 'alex', '_Person__age': 40}
# print(p1.age)
del p1.age # 删除属性
print(p1.__dict__) # {'name': 'alex'} __age被删除