Python __新建和初始化__

Python __新建和初始化__,python,Python,可能重复: 我试图理解如何使用这两种方法。我知道\uuuuu new\uuuuu用于创建对象,而\uuuu init\uuuu用于初始化。但我不确定创建对象时会发生什么 这是否意味着\uuuu new\uuuu和\uuuu init\uuuu必须具有相同的参数 如果我不使用相同的参数会发生什么 对 你会得到一个错误 (从技术上讲,对于\uuuuuu new\uuuuuu来说,第一个参数是类,而对于\uuuuuu init\uuuuuu来说,第一个参数是实例。但是,它们必须都能够接受相同的参数,

可能重复:

我试图理解如何使用这两种方法。我知道
\uuuuu new\uuuuu
用于创建对象,而
\uuuu init\uuuu
用于初始化。但我不确定创建对象时会发生什么


  • 这是否意味着
    \uuuu new\uuuu
    \uuuu init\uuuu
    必须具有相同的参数

  • 如果我不使用相同的参数会发生什么

  • 你会得到一个错误

  • (从技术上讲,对于
    \uuuuuu new\uuuuuu
    来说,第一个参数是类,而对于
    \uuuuuu init\uuuuuu
    来说,第一个参数是实例。但是,它们必须都能够接受相同的参数,因为除了第一个参数之外,传递给
    \uuuuuu init\uuuuuuuuu
    的参数与传递给
    的参数相同。)__新的

    >>类Foo(对象):
    …定义新(cls,x):
    …返回超级(Foo,cls)。\uuu新建\uuuu(cls)
    ...     
    …定义初始化(self,x,y):
    …通过
    >>>傅(1)
    回溯(最近一次呼叫最后一次):
    文件“”,第1行,在
    傅(1)
    TypeError:\uuuu init\uuuuuu()正好接受3个参数(给定2个)
    >>>傅(1,2)
    回溯(最近一次呼叫最后一次):
    文件“”,第1行,在
    傅(1,2)
    TypeError:\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
    
    这两个方法将被传递(几乎)相同的参数集,因此它们通常具有匹配的签名(相同的参数集)

    我在这里说“差不多”,因为
    \uuuuuuuuuuuuu
    方法作为第一个参数传递给类,而
    \uuuuuuuuu init\uuuuuuuuuu
    方法传递的是
    \uuuuuuuuuuuuuuu新创建的实例的结果

    在python中,您可以使用“通配符”参数;
    *args
    **关键字
    (请参阅),这意味着
    \uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu新的
    \uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu


    签名不匹配时会发生什么情况(考虑通配符参数)?向签名与传入的参数不匹配的任何python可调用函数传递参数时,会得到相同的结果;您会得到一个异常。

    部分由
    \uuuuuuuuuuuuuuuuu
    \uuuuuuuu init\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu>回答。这两个函数做了不同的事情,具有不同的参数。这是一个很好的概述。那么
    *另外,通过将
    x
    参数传递到
    super(..)。\uuuu new\uuuu
    您触发了一个弃用警告,混淆了OP。这就是为什么我说“两者必须能够接受相同的参数”。确实,您可以使用
    *args
    **kwargs
    来避免参数列表完全相同,但对于任何函数都是如此。重要的一点是,相同的args被传递给两个函数,因此它们必须能够接受相同的内容。(感谢您注意到DeprecationWarning的内容,我修复了它。)
    >>> class Foo(object):
    ...     def __new__(cls, x):
    ...         return super(Foo, cls).__new__(cls)
    ...     
    ...     def __init__(self, x, y):
    ...         pass
    >>> Foo(1)
    Traceback (most recent call last):
      File "<pyshell#260>", line 1, in <module>
        Foo(1)
    TypeError: __init__() takes exactly 3 arguments (2 given)
    >>> Foo(1, 2)
    Traceback (most recent call last):
      File "<pyshell#261>", line 1, in <module>
        Foo(1, 2)
    TypeError: __new__() takes exactly 2 arguments (3 given)