类和对象上的 `__new__` 和 `__init__`

Cyk*_*ker 2 python inheritance class python-3.x

在Python 3中,定义子类时,为什么需要用作 的cls第一个参数__new__,而不用作 的self第一个参数__init__

一个例子:

class MyClass(object):
    def __new__(cls, *args, **kwargs):
        return super(MyClass, cls).__new__(cls, *args, **kwargs) # with `cls`
    def __init__(self, *args, **kwargs):
        return super(MyClass, self).__init__(*args, **kwargs) # without `self`
Run Code Online (Sandbox Code Playgroud)

当我比较这些函数时,我变得更加困惑:

>>> cls = object
>>> self = cls()
>>> cls.__new__ is self.__new__
True
>>> cls.__init__ is self.__init__
False
>>> self.__init__()
>>> cls.__init__()
Traceback (most recent call last): ...
Run Code Online (Sandbox Code Playgroud)

__new__那么,这些结果之间和背后有何差异__init__?哪些方法是绑定的,哪些是免费的?为什么可以打电话self.__init__()却打不通cls.__init__()cls.__init__方法是在cls其自身中定义还是在其元类中定义?

use*_*ica 5

您可能缺少的图片的最大部分是__new__静态方法,即使您不使用装饰器,特殊情况@staticmethod也是如此。

当通过 调用方法时super()super()执行与该类型方法通常执行的相同类型的参数绑定(使用描述符协议)。对于像 之类的静态方法__new__,这意味着不会自动绑定任何参数,因此cls必须显式传递。对于像 之类的实例方法__init__,这意味着self自动绑定,这就是为什么您不必传递selfsuper().__init__.