Python 为什么uuu new_uuu方法在调用其父';新的跨越超方法?

Python 为什么uuu new_uuu方法在调用其父';新的跨越超方法?,python,super,Python,Super,我知道当我们跨超级方法调用父方法时,我们可以忽略绑定方法中的“self”参数,如下所示: class Foo(object): def __init__(self): super(Foo, self).__init__() # We needn't pass in the "self" argument # ... 但是在\uuuuuuuuuuuuuuuuu新方法中有些不同: class Bar(object): def __new__(cls,

我知道当我们跨超级方法调用父方法时,我们可以忽略绑定方法中的“self”参数,如下所示:

class Foo(object):
    def __init__(self):
        super(Foo, self).__init__() # We needn't pass in the "self" argument
        # ...
但是在
\uuuuuuuuuuuuuuuuu新方法中有些不同:

class Bar(object):
    def __new__(cls, *args, **kwargs):
        return super(Bar, cls).__new__(cls, *args, **kwargs) # Why need a "cls" argument?

\uuuu new\uuuu
不是实例方法;它是传递给类对象的静态方法(使其也不是一个类方法)

从:

\uuuu new\uuuuu()
是一个静态方法(特殊情况下,您不需要声明它),它将请求实例的类作为其第一个参数

因此,即使使用
super()
在MRO中查找下一个
\uuuuuuuuuuuuuuuuu新方法,您仍然需要显式地传入
cls


带有双下划线的特殊方法通常在类型上查找,在类的元类上也是如此(默认情况下是
type()
)。这对
\uuuu new\uuuu
不起作用,因为您直接在类本身上声明了它。因此,也不能应用no(这通常会将函数转换为绑定方法,例如类和实例方法)。因此,
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。