面向对象----封装之proprty


封装之 property:

property是一种特殊的属性,访问它时会执行一段功能(函数),然后返回值。
把类体的方法,通过property函数来装饰,装饰过的方法对象可以通过调用属性的方式来调用,
对象名 +‘.’+属性名

例:
BMI指数(bmi是计算而来的,但很明显它听起来像是一个属性而非方法,
如果我们将其做成一个属性,更便于理解)

成人的BMI数值:
过轻:低于18.5
正常:18.5-23.9
过重:24-27
肥胖:28-32
非常肥胖, 高于32
  体质指数(BMI)=体重(kg)÷身高^2(m)
  EX:70kg÷(1.75×1.75)=22.86
 1 class PeopleBMI:
 2     def __init__(self,name,weight,height):
 3         self.name=name
 4         self.weight=weight
 5         self.height=height
 6 
 7     @property
 8     def bim(self):
 9         """
10         定义bim方法
11         :return:
12         """
13         return self.weight / (self.height**2)
14 # 定义对象
15 yangwei=PeopleBMI('yangwei',62.5,1.7)
16 """
17 这样我们就可以直接加点来调用。  
18 调用yangwei.bmi本质就是触发函数bmi的执行,
19 从而拿到其返回值
20 
21 """
22 print(yangwei.bim)

通过调用property属性 又衍生了 setter 与 deleter 两个装饰器。
 1 class PeopleBMI:
 2     def __init__(self,name,weight,height):
 3         self.__name=name  #把name属性隐藏起来。
 4         self.weight=weight
 5         self.height=height
 6     @property
 7     def name(self):
 8         print('你正在访问用户名!')  # 我们可以加一系列逻辑判断。
 9         return self. __name
10     
11     @name.setter  #按照原方法调用
12     def name(self,nname):
13         if type(nname)is not str:
14             raise TypeError('必须为str 类型')
15         self.__name=nname
16         
17     @name.deleter
18     def name(self):
19         print('确认删除吗?')
20         del self.__name
21         
22 obj=PeopleBMI('yangwei',62,1.7)
23 del obj.name
24 obj.name='egon'
View Code

 

posted @ 2018-04-16 15:39  yangweiwe  阅读(245)  评论(0)    收藏  举报