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

Python中@classmethod调用与直接实例化类调用方法的区别是什么

Python类实例方法与类方法调用差异解答

两种调用方式的执行逻辑差异

首先你给出的两类调用,核心执行流程区别如下:

  • MyClass().test1() 执行步骤:
    1. 先实例化MyClass生成一个实例对象,执行一次__init__初始化属性self.my_string
    2. 在已生成的实例上调用实例方法test1,直接返回实例已有的my_string属性
      全程仅创建1次实例,调用链路短。
  • MyClass.test2() 执行步骤:
    1. 直接调用MyClass的类方法test2,自动传入类本身作为cls参数
    2. test2内部会再执行一次cls(),重新创建一个全新的MyClass实例,执行一次__init__初始化属性
    3. 返回新实例的my_string属性
      全程同样创建1次实例,但多了一层类方法的调用栈开销,调用链路更长。

耗时差距大的原因

如果是单次调用两者耗时差距不会太明显,差距大的核心原因大概率是你在循环/高频率场景下反复调用:
每次调用test2都会多一层函数调用开销,累积之后耗时差距就会被放大。如果你的测试场景是提前创建了一次实例后反复调用test1(比如obj = MyClass() 之后循环调用obj.test1()),那test1不需要反复创建实例、执行初始化逻辑,性能优势会更明显。

写法选择建议

没有绝对的最优,完全看你的使用场景:

  • 如果你需要多次调用方法获取属性,优先选择实例方法test1:提前创建一次实例后反复调用即可,不需要每次都重新生成实例、跑初始化逻辑,性能最高。
  • 如果你确实需要每次调用都生成全新的实例,且不想手动维护实例创建逻辑,调用频率也很低的情况下,可以用test2的写法,本质是把实例化步骤封装到了类方法里。
  • 额外优化建议:如果你的返回值是固定值,不需要依赖实例状态,完全可以改成直接返回类属性,不需要每次创建实例,性能会比前两种都高很多:
class MyClass():
    my_string = 'Hello'
    @classmethod
    def test3(cls):
        return cls.my_string

内容的提问来源于stack exchange,提问作者Elger

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 06:48:03