2016-01-13 13 views
6

I naprawdę nie rozumiem, gdzie jest błąd w tym małym kodu:TypeError: Object() bez parametrów po zdefiniowaniu __new__

#!/usr/bin/python3 


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

Ten kod przedstawiony powyżej daje mi błąd:

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 

Odpowiedz

9

W Pythonie 3.3 i nowszych, jeśli nadpisujesz zarówno __new__, jak i __init__, unikaj przekazywania dodatkowych argumentów metodom, które nadpisujesz. Jeśli zastąpisz tylko jedną z tych metod, możesz przekazać dodatkowe argumenty drugiej (ponieważ zazwyczaj dzieje się to bez Twojej pomocy).

Tak, aby naprawić swój klasę, zmienić metodę __new__ tak:

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! 
+0

FWIW, kod OP jest faktycznie działa w Python3.2, choć błąd rzeczywiście występuje w Python3.3 + – plamut

+0

Dzięki bro, wygląda na to, że działa. proszę, powiedz mi, jak Python przekazuje resztę argumentów do __init__, czy możesz wyjaśnić mi ten proces (jeśli masz czas oczywiście)? !! – Sidahmed

+0

Wywołanie '__init__' nie jest wywołane przez' object .__ new__', ale raczej przez 'type .__ call__' (związany z obiektem klasy). Tak więc obiekt .__ new__' nie musi wyświetlać tych samych argumentów, których oczekuje funkcja "__init__". – Blckknght

Powiązane problemy