一、面向对象的成员包括:字段(普通字段属于对象,静态字段属于类)、方法、属性
属性:为什么引入属性? 先看个例子!!!
例一: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 class Person: def __init__(self, name, weight, height): self.name = name self.height = height self.weight = weight def bmi(self): return ('%s 的 BMI指数为 %s' % (self.name, (self.weight / self.height ** 2))) b = Person('王帆', 67, 1.78) print(b.bmi())
此时代码能够实现该功能 ,但是,bim是一个名词,相当于一种属性,但是在代码中却执行了bmi方法,并且打印的时候需要打印b.bmi() 而不是 b.bmi,所以,在python中不合理,需要进行改进。
此时引入了属性。
属性,就是将方法伪装成一个属性,代码本身没有提升,只是更加合理。
例一: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 class Person: def __init__(self, name, weight, height): self.name = name self.height = height self.weight = weight @property # 在需要调用的函数上方 添加 @property 这个装饰器,将bmi方法伪装成一个属性 def bmi(self): return ('%s 的 BMI指数为 %s' % (self.name, (self.weight / self.height ** 2))) b = Person('王帆', 67, 1.78) print(b.bmi) # 打印的时候为 b.bmi 而不用再加括号。
属性的应用:
二、类方法:用类名调用的方法,类方法中约定俗成第一个参数为cls。python自动将类名传给cls。
类方法的应用场景
第一:
第二:对类中的静态变量进行改变。
对象无法对类中的静态变量进行改变。
第三:在继承中,父类要得到子类的类空间,在里边为所欲为。
三、静态方法
静态方法好处:
1、当类有多个函数的时候,可以将实现一个功能的多个函数放到一个类中,是代码块更加清晰。
2、可以将静态变量放在父类中。如果有好多子类都继承父类,就能够节约代码。提高太妈的复用性。