在 python 里,cls是类方法中的第一个参数,它代表类本身而不是具体的对象实例。虽然它不是 python 的强制关键字,但按照国际通用的 pep8 规范,大家都习惯用cls这个名字来指代当前类 。
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()) # 输出: human3. 最核心的应用场景(工厂方法)
利用 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 __ 重载或替代构造函数时,它是首选利器。
到此这篇关于python中的cls定义与使用的文章就介绍到这了,更多相关python cls使用内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论