cls 是什么,作用有哪些?

cls 是什么,作用有哪些?

1. cls 出现在哪里?

cls 是一个约定俗成的参数名称 ,代表类本身 (class)。它类似于 Java 中的 ClassName.class 或静态方法中的类引用。
cls 通常出现在:

  • 类方法@classmethod)的第一个参数
  • __new__ 方法 的第一个参数(__new__ 是一个特殊的静态方法,用于创建实例)

在你给出的代码中:

python 复制代码
def __new__(cls):
    if cls._instance is None:
        cls._instance = super(Database, cls).__new__(cls)
        cls._instance._initialize()
    return cls._instance

这里的 cls 指的就是 Database 这个类本身。


2. cls vs self 的区别

参数 含义 指向 使用场景
self 实例本身 具体的对象 普通实例方法(def method(self):
cls 类本身 类对象(不是实例) @classmethod__new__ 方法

类比 Java

  • selfthis
  • clsDatabase.class 或者静态方法中通过类名直接调用

3. 在单例模式中 cls 的作用

  • cls._instance:相当于 Database._instance,是一个类变量,所有实例共享。
  • super(Database, cls).__new__(cls):调用父类 object__new__ 方法,并传入 cls(即 Database 类),让父类为 Database 类分配内存并创建实例。
  • 整个过程确保只创建一个实例,并且通过 cls 访问和存储这个唯一的实例。

4. 与 Java 的对比

Python Java
cls 作为第一个参数显式传递 类引用隐式可用(如 MyClass.class
@classmethod 中第一个参数是 cls 静态方法中无法访问类的非静态成员,但可以通过类名直接调用
__new__(cls) 是静态方法(隐式),负责创建实例 Java 中用 new 关键字创建实例,无法直接重写 new
通过 cls._instance 访问类变量 通过 MyClass.staticField 访问静态字段

Java 模拟单例的常见写法

java 复制代码
public class Database {
    private static Database instance = null;
    private Database() {}
    public static Database getInstance() {
        if (instance == null) {
            instance = new Database();
        }
        return instance;
    }
}

注意:Java 的静态方法中虽然没有 cls 参数,但可以直接使用类名 Database 来引用类本身,效果类似于 Python 的 cls


5. 总结

  • cls = 类对象 ,类似于 Java 中的 ClassName.class
  • __new__@classmethod 中,cls 由 Python 自动传入,不需要你手动提供。
  • 使用 cls 可以访问类变量、调用其他类方法、创建该类的新实例等。

理解 cls 有助于掌握 Python 的类级别操作,特别是单例模式、工厂方法、元类编程等高级特性。

相关推荐
少时登峰16 小时前
【吃透 MySQL InnoDB连载】第 6 章・索引底层原理
数据库·mysql
AllData公司负责人17 小时前
数据集成管理|AIIData数据中台实现MySQL、Hive、Oracle一键接入Doris
大数据·数据库·人工智能·hive·mysql·oracle·数据分析
Databend17 小时前
小 Bitmap,大优化:Databend 如何加速大规模集合聚合
大数据·数据库·sql
倔强的石头_17 小时前
KES 优化行为避坑指南-那条从没被质疑过的 LEFT JOIN,在迁 KES 时终于露馅了
数据库
Database_Cool_17 小时前
RAG 混合检索首选:阿里云 Lindorm 向量+全文一体化检索
数据库·阿里云·django·云计算
ByWalker_17 小时前
web应用技术—MyBatis入门
java·数据库·mybatis·lombok
指尖的爷17 小时前
Ubuntu 24.04 彻底关闭自动更新(桌面+服务器通用)
服务器·数据库·ubuntu
gcw102418 小时前
Cron专业工具:定时任务与开发办公的一站式在线工具箱
java·前端·数据库·工具·crontab·cron·spring cron
江华森18 小时前
Gephi 可视化 + NetworkX 网络分析——《釜山行》人物关系(三)
数据库·python
whaledown18 小时前
互联网大厂Java求职面试三轮提问详解(涵盖Spring Boot、微服务、Kafka等核心技术)
java·jvm·数据库·spring boot·微服务·面试·kafka