siven-siven 发表于 2020-12-11 12:12:57

关于cls和self

在类的魔法函数中,__new__(cls)中的cls到底有什么用,他是代表“Capstr”这个类么?self不应该是代表c这个实例么,怎么打印出AAA了。


>>> class Capstr(str):
        def __new__(cls,string):
                print(cls)
                print(id(cls))
                string = string.upper()
                return str.__new__(cls,string)
        def __init__(self,string):
                print(self)

               
>>> c = Capstr('aaa')
<class '__main__.Capstr'>
2705518804976
AAA

sunrise085 发表于 2020-12-11 12:48:18

cls和self都是方法的形参,在类的方法中一般情况下cls指代类,self指代类实例,即有cls的方法用类名称调用,有self的方法用类实例调用。这里的方法__new__就是用类名称调用的,就像你下面写的 c=Capstr('aaa')
self指代的是类实例,但不是类实例名称。c为该类实例变量名称。就像是定义一个 int 类型变量num=4,我们只能说这个整型数是4,名称是a,不能说这个整型数是a。况且在这里进行初始化的时候还没有把该实例赋值给c 。
__new__是创建一个该类的实例对象,__init__只是初始化一个该类的实例对象。
c=Capstr('aaa') 是先执行__new__ 创建一个该类的实例对象 'AAA' ,然后再执行__init__ 进行初始化。self指代的是该类的实例化对象 即,'AAA'
页: [1]
查看完整版本: 关于cls和self