关于python:__ new__和__init__

__new__ and __init__

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Python's use of __new__ and __init__?

我想知道如何使用这两种方法。我知道__new__用于创建对象,而__init__用于初始化。但我不确定当我创建一个对象时会发生什么。

  • 这是否意味着__new____init__必须具有相同的参数?

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


  • 对。

  • 你会得到一个错误。

  • (从技术上讲,对于__new__,第一个参数是类,而对于__init__,第一个参数是实例。但是,他们必须都能接受相同的论点,因为除了第一个论点外,传递给__init__的论点与传递给__new__的论点相同。)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    >>> 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)


    这两个方法将(几乎)传递相同的参数集,因此通常它们具有匹配的签名(相同的参数集)。

    我之所以说"几乎",是因为__new__方法作为第一个参数传递类,而__init__方法则传递__new__方法的结果;新创建的实例。

    在python中,您可以使用"通配符"参数:*args**keyword(请参见*args和**kwargs是什么意思?)也就是说,__new____init__都可以使用这些参数来命名传入的一些参数。

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