在 Python 中, cls类方法的第一个参数,代表 类本身(一个类对象)。它和实例方法中的 self 地位对等,但指向完全不同。

1. 核心区别:cls vs self

  • self:属于实例方法,指向当前实例对象,用于访问实例属性。
  • cls:属于类方法(@classmethod 修饰),指向当前类,用于访问类属性或调用类构造函数。

2. 如何定义与使用

必须搭配 @classmethod 装饰器,参数名 cls 是强大约定(可改名但不建议)。

class Person:
    species = "Human"  # 类属性

    def __init__(self, name):
        self.name = name

    # 类方法
    @classmethod
    def create_anonymous(cls):
        # cls 指向 Person,等价于 Person("Anonymous")
        return cls("Anonymous")

    @classmethod
    def get_species(cls):
        return cls.species  # 访问类属性

# 调用时无需传入cls,Python自动传入
p = Person.create_anonymous()
print(p.name)        # 输出: Anonymous
print(Person.get_species())  # 输出: Human

3. 最核心的应用场景(工厂方法)

利用 cls 可以实现多种构造方式,且支持多态继承(子类调用时,cls 自动指向子类,无需重写):

class DateTime:
    def __init__(self, year, month, day):
        self.year = year
        self.month = month
        self.day = day

    @classmethod
    def from_string(cls, date_str):
        # 工厂方法:解析字符串创建实例
        y, m, d = map(int, date_str.split('-'))
        return cls(y, m, d)  # 注意这里用的是 cls

class LogTime(DateTime):
    pass

# 子类调用父类工厂,cls 自动变为 LogTime,返回 LogTime 实例
log = LogTime.from_string("2026-07-15")
print(type(log))  # <class '__main__.LogTime'>

4. 面试易错点:@classmethod vs @staticmethod

  • @classmethod:必须传 cls,能访问/修改类状态,也能被继承。
  • @staticmethod:不需要传 self cls,只是类命名空间下的普通函数,无法访问类或实例属性。
class Test:
    @staticmethod
    def static_method():
        return "我不需要cls"

总结一句话:看到 cls,记住它是“类的替身”,专门用于在类方法里操作类属性或灵活地创建本类(及子类)的实例。在写 __init __ 重载或替代构造函数时,它是首选利器。 🚀

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐