Python中@classmethod调用与直接实例化类调用方法的区别是什么
Python类实例方法与类方法调用差异解答
两种调用方式的执行逻辑差异
首先你给出的两类调用,核心执行流程区别如下:
MyClass().test1()执行步骤:- 先实例化
MyClass生成一个实例对象,执行一次__init__初始化属性self.my_string - 在已生成的实例上调用实例方法
test1,直接返回实例已有的my_string属性
全程仅创建1次实例,调用链路短。
- 先实例化
MyClass.test2()执行步骤:- 直接调用
MyClass的类方法test2,自动传入类本身作为cls参数 test2内部会再执行一次cls(),重新创建一个全新的MyClass实例,执行一次__init__初始化属性- 返回新实例的
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
相关产品推荐
相关产品推荐

