__new__和__init__

时间:2012-08-03 05:46:35

标签: python

  

可能重复:
  Python's use of __new__ and __init__?

我正在尝试了解如何使用这两种方法。我知道__new__用于创建对象,而__init__用于初始化。但是我不确定在创建对象时会发生什么。

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

  2. 如果我不使用相同的参数会怎样?

2 个答案:

答案 0 :(得分:6)

  1. 您将收到错误。

  2. (从技术上来说,__new__第一个参数是类,而__init__第一个参数是实例。但是,它们必须都能够接受相同的参数,因为,除了第一个参数之外,传递给__init__的参数与传递给__new__的参数相同。)

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

答案 1 :(得分:5)

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

我说“差不多”,因为__new__方法作为第一个参数传递给类,而__init__方法传递__new__方法的结果;新创建的实例。

在python中,可以使用“通配符”参数; *args**keyword(请参阅What do *args and **kwargs mean?),这意味着__new____init__可以使用这些来命名 some 传入的参数。

当签名不匹配时(考虑到通配符参数)会发生什么?你得到的结果与将参数传递给任何python callable的结果相同,python的callable的签名与传入的参数不匹配;你得到一个例外。