TypeError:object()在定义__new__后不带参数

Sid*_*med 20 python python-3.x

我真的不知道这个小代码中的错误在哪里:

class Personne:
    def __init__(self, nom, prenom):
        print("Appel de la méthode __init__")
        self.nom = nom
        self.prenom = prenom

    def __new__(cls, nom, prenom):
        print("Appel de la méthode __new__ de la classe {}".format(cls))
        return object.__new__(cls, nom, prenom)

personne = Personne("Doe", "John")
Run Code Online (Sandbox Code Playgroud)

上面给出的代码给出了错误:

Traceback (most recent call last):
  File "/home/bilal/Lien vers python/21_meta_classes/1_instanciation.py", line 21, in <module>
    personne = Personne("Doe", "John")
  File "/home/bilal/Lien vers python/21_meta_classes/1_instanciation.py", line 14, in __new__
    return object.__new__(cls, nom, prenom)
TypeError: object() takes no parameters
Run Code Online (Sandbox Code Playgroud)

Blc*_*ght 31

在Python 3.3及更高版本,如果你要覆盖这两个__new____init__,你需要避免传递任何额外的参数给object你覆盖的方法.如果您只覆盖其中一个方法,则允许将额外的参数传递给另一个方法(因为这通常在没有您帮助的情况下发生).

因此,要修复您的类,请更改__new__方法,如下所示:

def __new__(cls, nom, prenom):
    print("Appel de la méthode __new__ de la classe {}".format(cls))
    return object.__new__(cls) # don't pass extra arguments here!
Run Code Online (Sandbox Code Playgroud)

  • 谢谢兄弟,看来它正在工作。请告诉我,python如何将其余参数传递给__init__,您能否向我解释该过程(如果您有时间)? (2认同)
  • 对__init__的调用不是由object .__ new__进行的,而是由type .__ call__(绑定到类对象)进行的。因此object .__ new__不需要看到__init__函数期望的参数。 (2认同)
  • @Blckknght 你知道为什么它在 Python3.3+ 中这样工作吗?它在某处描述吗?我在文档中找不到这种行为的描述? (2认同)
  • 我想我现在有一个答案。它隐藏在typeobject.c中的注释中:https://github.com/python/cpython/blob/5a4bbcd479ce86f68bbe12bc8c16e3447f32e13a/Objects/typeobject.c#L3538 (2认同)