首页 > 解决方案 > `__new__` 和 `__init__` 在类和对象上

问题描述

在 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`

当我比较这些功能时,我变得更加困惑:

>>> 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): ...

那么,这些结果之间__new____init__背后的区别是什么?哪些方法是绑定的,哪些是免费的?为什么能打电话self.__init__()却不能cls.__init__()?方法是在其自身还是在其元类中cls.__init__定义的?cls

标签: pythonpython-3.xclassinheritance

解决方案


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

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


推荐阅读