You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用@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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 22:00:09