使用@classmethod修改类变量pi后输出未变,及实例方法访问volume的问题
问题解答
先看修改后的完整代码:
import math as m class Volume_cylinder_cp: # class variable pi = 3.14 # constructor def __init__(self, radius, height, cp_milk): self.radius = radius self.height = height self.cp_milk = cp_milk # instance method def cal_vol(self): # 改用类/实例的pi变量,而非math模块的固定pi值 volume = self.pi * (pow(self.radius, 2)) * self.height print("Volume of cylinder: ", volume) return volume # instance method def cost_price(self): # 直接通过self调用实例方法cal_vol cp = self.cal_vol() * self.cp_milk print("Cost price: ", cp) # class method @classmethod def new_pi(cls, new_pi_val): # 修改类变量 cls.pi = new_pi_val vol_cp = Volume_cylinder_cp(2, 6, 10) # 调用实例方法 vol_cp.cal_vol() vol_cp.cost_price() print("after modifying the pi value") # 调用类方法 Volume_cylinder_cp.new_pi(3.2) vol_cp.cal_vol()
问题1:修改类变量pi后体积无变化的原因及解决
你定义了类变量pi,但cal_vol方法里计算体积用的是m.pi(math模块的固定圆周率≈3.14159),完全没用到自己类里的pi变量。所以不管你用类方法怎么修改类的pi,计算时还是取math的固定值,体积自然不变。
解决方法就是把cal_vol里的m.pi换成self.pi(或者Volume_cylinder_cp.pi),这样计算时就会使用类/实例的pi变量,修改后就能生效。
问题2:cost_price中不通过类访问cal_vol的方法
原来的写法Volume_cylinder_cp.cal_vol(self)是把实例作为参数传给类的方法,属于不规范的调用方式。直接用self.cal_vol()即可——实例方法可以通过自身实例(self)直接调用其他实例方法,既简洁又符合Python面向对象的规范。
内容的提问来源于stack exchange,提问作者Sree
相关产品推荐
相关产品推荐

