示例:
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),而应该使用类方法,因为计数器应该是类共享的,而不是每个对象的。
故事
开发者将与类无关的业务逻辑放在类内部的静态方法中。其他人无法找到这个函数,因为他们没有预期它在其他类的空间中,这使得维护变得复杂。