5 python
我试图了解如何使用这两种方法.我知道这__new__ 用于创建一个对象,同时__init__进行初始化.但是我不确定在创建对象时会发生什么.
这是否意味着__new__和__init__必须具有相同的参数?
如果我不使用相同的参数会发生什么?
是.
你会收到一个错误.
(从技术上来说,__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)
Run Code Online (Sandbox Code Playgroud)
两种方法都将(几乎)传递相同的参数集,因此通常它们具有匹配的签名(相同的参数集).
我说'几乎'在那里,因为该__new__方法作为第一个参数传递给类,而__init__方法传递给方法的结果__new__; 新创建的实例.
在python中,您可以使用"通配符"参数; 在*args和**keyword(见什么做的*指定参数和**kwargs是什么意思?),这意味着无论是__new__或__init__可以使用这些仅命名了一些传入的参数.
签名不匹配时会发生什么(考虑到通配符参数)?你得到的结果与将参数传递给任何python callable的结果相同,python的callable的签名与传入的参数不匹配; 你得到一个例外.
| 归档时间: |
|
| 查看次数: |
4418 次 |
| 最近记录: |