今天碰到一个疑问,就是 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 对象的啦
自行学习中的理解,如有不对之处,欢迎大家指正。