• Python 面试高频问题:cls到底是什么


     

    上一篇文章介绍了什么是python 中的self,详情请参考:

    Python面试高频问题:self到底是什么

    简单的说self是类(Class)实例化的对象。

    面试中还有一个问题经常被提及,那就是——什么是cls呢?

    cls定义

    cls 是类(或子类)本身,取决于调用的是哪个类。

    看下面的实例

    1. class MyClass1():
    2. @classmethod
    3. def test_cls(cls):
    4. print(cls)
    5. class MyClass2():
    6. @classmethod
    7. def test_cls(cls):
    8. print(cls)
    9. MyClass1.test_cls()
    10. MyClass2.test_cls()

    输出:

    <class '__main__.MyClass1'>

    <class '__main__.MyClass2'>

    我们也可以通过实例的方法调用class method,例如:

    1. MyClass1.test_cls()
    2. MyClass2.test_cls()
    3. my1=MyClass1()
    4. my2=MyClass2()
    5. my1.test_cls()
    6. my2.test_cls()

    同样输出

    输出:

    <class '__main__.MyClass1'>

    <class '__main__.MyClass2'>

    使用cls 作为方法参数时,通常该方法需要由@classmethod 修饰,@classmethod修饰的方法表示的是类方法。这里需要注意cls就是一个标识,你可以把他写成abc,bcd都是可以的,只是出于习惯写成了cls。

    cls是一个类

    既然cls是一个类,那么我们就可以使用他来进行实例化,具体代码如下:

    1. class MyClass3():
    2. @classmethod
    3. def test_cls_obj(cls):
    4. obj1 = cls()
    5. obj2 = cls()
    6. print(obj1)
    7. print(obj2)
    8. print(type(obj1))
    9. print(type(obj2))
    10. MyClass3.test_cls_obj()

    输出:

    <__main__.MyClass3 object at 0x000000690A1E0C08>

    <__main__.MyClass3 object at 0x000000690A1E0C48>

    <class '__main__.MyClass3'>

    <class '__main__.MyClass3'>

    可以看到通过obj1=cls()和obj2=cls(),成功创建了两个实例,分别是0x000000690A1E0C08和0x000000690A1E0C48,而这两个实例的类型都是MyClass3'

    cls作为__new__的参数

    另外cls 还可以在python类中的方法 __new__里实现,通常定义为:

    1. class class_name:
    2. def __new__(cls, *args, **kwargs):
    3. return super(class_name, cls).__new__(cls, *args, **kwargs)

    接下来我会写一篇文章关于__new__ 和__init__ ,也请大家持续关注!

    总结cls和self

    最后我们可以简单地总结一下self 和 cls:简单的说self是类(Class)实例化的对象。

    cls 是类(或子类)本身。我们也可以方便地理解self表示实例的,cls则表示类的!

  • 相关阅读:
    效率提升75%!要做矩阵号,更要做好矩阵号管理
    干货 | 一文搞定 pytest 自动化测试框架
    计算机毕业设计Java-ssmSUNHome家政服务管理平台源码+系统+数据库+lw文档
    关于3位数字加上不同范围的随机数之后对大小正确率的影响
    verilog testbench
    使用Langchain+GPT+向量数据库chromadb 来创建文档对话机器人
    nginx配置参数解释
    vue轮播图使用swiper插件
    数据结构-树的概念结构及存储
    mysql update更新数据时null字段是否更新进数据库总结
  • 原文地址:https://blog.csdn.net/liwenxiang629/article/details/125516757