面向对象之 属性

 对象属性:

  

例一: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

要求:创建一个类来实现 bmi这个功能
class Person:
  def __init__(self, name, hight, weight):
    self.name = name
    self.__hight = hight
    self.__weight = weight
  def bim(self):
    return self.__weight / self.hight ** 2
p = P("张三",70, 1.7)
print(p.bmi())

# 这里的bmi是一个方法,但在现实生活中bim是一个名词,所以我们可以用@property 来把方法伪装成变量
class Person:
  def __init__(self, name, hight, weight):
    self.name = name
    self.__hight = hight
    self.__weight = weight
  @property #在方法前添加@property就可以把方法伪装成变量,调用时和变量用法相同
  def bim(self):
    return self.__weight / self.hight ** 2
p = P("张三",70, 1.7)
print(p.bmi) # 这里只需要写成 p.bmi就可以不需要加括号

# 既然把bmi方法伪装成了变量,现在可以当做变量来调用,但是怎么去修改或删除呢?
# 我们可以用@方法名.setter 来实现像变量一样的修改方式 删除用@方法名.deleter
class Person:
  def __init__(self, name, hight, weight):
    self.name = name
    self.__hight = hight
    self.__weight = weight
  
  @property #在方法前添加@property就可以把方法伪装成变量,调用时和变量用法相同
  def hight(self):
    self.hight = self.__hight
    
  
  @hight.setter # 当需要修改时会自动执行下面代码
  def hight(self,a):
    self.__hight = a

  @hight.deleter # 收到删除命令时会自动执行下面代码
  def hight(self):
    del self.__hight


p = P("张三",70, 1.7)
print(p.hight)
p.hight = 1.8
print(p.hight)
del p.hight
posted @ 2019-08-07 16:00  bit_byte  阅读(140)  评论(0)    收藏  举报