※ 引述《jasonhsu14 (14号星期五的杰森)》之铭言:
: H1=Human1()
: print(H1.BMI())得到当初创建类别时的默认或输入的数字
: print(H1.BMI(170,80))时,得到不一样的结果
: 有想过直接在 def BMI(self, h=160, w=50)这样去写
: 但这样又等于重复做了跟__init__一样的事情
: 所以想询问有无办法让BMI变成一个
: 不输入的话就会根据最一开始创建类别的默认(或输入)数值
: 但也可以让BMI自己另外输入想要的数字
忽然觉得想说的多了点,还是回文好了。虽然推文给了一个回答,但我觉得最好
还是从概念上来处理这个问题。
H1.BMI()
这写法很直觉,就是得到H1这个实体本身的BMI,没有问题。但是:
H1.BMI(170, 80)
请问你觉得这是什么概念呢?叫H1这个人帮你算算170/80的人BMI是多少?
你可以发现,这两个用法的概念是冲突的。前者把H1当作一个有BMI的实体,后
者却只是一个计算BMI的计算器。
那么我的建议是,应该把实体跟计算器的角色分开来。这个计算器谁来负责呢?
我认为是Human1 class本身,把计算方法定义成Human1的一个静态方法。当我们要计
算任意一组资料的BMI时,我们呼叫:
Human1.cal_BMI(170, 80)
这个cal_BMI()可以定义为:
@classmethod
def cal_BMI(cls, h, w):
# 计算并return BMI
当我们要得知一个实体H1本身的BMI时,我们呼叫:
H1.BMI()
而这个BMI()则定义为:
def BMI(self):
return Human1.cal_BMI(self.h, self.w)
这样,我们就既不需要在两处处理default值(__init__跟BMI),也兼顾了code
的重用性,同时让实体跟class本体的角色更明确。同时,也不需要写烦人的逻辑来
判断输入值是什么情况、要用内部值或外部值等等。
BMI要修改计算方式,我们只需要改动cal_BMI(),除非引入了其他参数或要改变
实体与类的计算连接方式(比如说,公开测量时的cal_BMI都是很公正的,但是要让
每个人自报BMI时都故意低报一点,就像NBA球员偷偷高报身高XD)才会动到BMI()。