编程Python 开发者

解释一下 Python 中类方法(@classmethod)、静态方法(@staticmethod)和实例方法之间的区别。在什么情况下选择什么?

用 Hintsage AI 助手通过面试

答案。

  • 实例方法 — 第一个参数是 self,即指向具体对象的引用。用于访问/修改对象的状态。
  • @classmethod 第一个参数是 cls — 指向类本身的引用,而不是对象。用于工厂方法或处理整个类的方法。
  • @staticmethod 完全不接受隐式参数。这是放在类空间中的普通函数 — 用于逻辑分组。

示例:

class MyClass: def instance_method(self): print(f"实例: {self}") @classmethod def class_method(cls): print(f"类: {cls.__name__}") @staticmethod def static_method(): print("普通函数") obj = MyClass() obj.instance_method() # self 是 obj MyClass.class_method() # cls 是 MyClass MyClass.static_method() # 没有 self/cls

有陷阱的问题。

常见问题:

可以通过实例调用类方法吗?这与通过类本身调用有什么不同?

回答: 是的,类方法可以通过实例调用,也可以通过类本身调用。无论从哪里调用,第一个参数总是类,而不是实例。通过实例调用时,传递的是其类作为 cls。

由于对主题细微差别的不了解导致的真实错误示例。


故事

在项目中,所有工厂方法都做成了静态方法(@staticmethod),但内部需要知道子类的名称 — 这变得不可能。改成了 @classmethod,以便获得 cls 引用。


故事

为了生成实例的唯一 ID,使用了普通方法(self),而应该使用类方法,因为计数器应该是类共享的,而不是每个对象的。


故事

开发者将与类无关的业务逻辑放在类内部的静态方法中。其他人无法找到这个函数,因为他们没有预期它在其他类的空间中,这使得维护变得复杂。