python 中的重写new方法 为什么要传cls类参数

        今天碰到一个疑问,就是 python3 中,每次重写new 方法,都要传一个cls类参数,如下图,一个 cat 类中 重写了一个new方法,此时我们用super 调用 object 类中的 new 方法时,发现super().__new__(cls),需要传一个cls 参数

class cat():

    def method(self):
        print('11')

    def __new__(cls, *args, **kwargs):
        print("1")
        return super().__new__(cls)

于是我打开了  object 类中的 new 方法,发现,new 方法是一个  静态方法 ,正常来说静态方法是不需要传 cls 类参数的,需要传类参数的应该是类方法呀



#这是一个普通的 类方法,是需要传 cls的
 @classmethod
   def methon(cls):
      print("这是一个类方法")


#这是一个普通的静态方法,是不需要传cls这个类参数的
 @staticmethod
   def static_methon():
      print("这是一个静态方法")


# 这是 object 类中的 new 方法,这里也传了cls参数   
 @staticmethod # known case of __new__
    def __new__(cls, *more): # known special case of object.__new__
        """ Create and return a new object.  See help(type) for accurate signature. """
        pass

于是,我带着这样的一个疑问,写了一段简单的代码,并开始我的调试。

class cat():

    def method(self):
        print('2')

    def __new__(cls, *args, **kwargs):
        print("1")
        return super().__new__(cls)
cat().method()

调试时发现,cls 这个参数接收的的是当前的类对象,可以看下图中调试时cls 这个参数的值,

 我们都知道,new方法是一个特殊的方法,我们在用类创建实例对象时,都会调用 new方法 分配一个内存空间,并且返回这个地址,想到这里应该比较好解释了,如果要创建实例对象,那么必须知道我要给谁去创建实例对象,就好像一个女人要生孩子,那么必须需要一个男人,这个男人就是这个要传入的类对象,创造孩子这个动作就等于 new 方法。所以尽管他是一个 静态方法,但他还是需要一个 cls 对象的啦

自行学习中的理解,如有不对之处,欢迎大家指正。

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值