python中的cls
·
在 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 __ 重载或替代构造函数时,它是首选利器。 🚀
更多推荐



所有评论(0)