Utilisation de la méthode spéciale __new__

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour à tous, je suis un tutoriel d'apprentissage sur python et j'ai abordé la notion de métaclasse, voilà seulement en reprenant un exemple du tutoriel, je rencontre une étrange erreur :(

Voici le code que j'ai testé

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class Personne:

    """Classe définissant une personne.

    Elle possède comme attributs :
    nom -- le nom de la personne
    prenom -- son prénom
    age -- son âge
    lieu_residence -- son lieu de résidence

    Le nom et le prénom doivent être passés au constructeur."""

    def __new__(cls, nom, prenom):
        print("appel de la méthode __new__ dans la classe", cls)
        object.__new__(cls, nom, prenom)

    def __init__(self, nom, prenom):
        print("appel de la méthode __init")
        self.nom = nom
        self.prenom = prenom
        self.age = 22
        self.lieu_de_residence = "Paris"


if __name__ == "__main__":
    personne = Personne("Doe", "John")
    print(personne.nom)

Voici l'erreur qui s'affiche

1
2
3
4
5
6
Traceback (most recent call last):
  File "C:/Users/liy/PycharmProjects/test/metaclasse.py", line 16, in <module>
    personne = Personne("Doe", "John")
  File "C:/Users/liy/PycharmProjects/test/metaclasse.py", line 5, in __new__
    object.__new__(cls, nom, prenom)
TypeError: object() takes no parameters

En regardant l'erreur sur google, ce qui a souvent été signalé, c'est un problème d'indentation mais j'ai réécris mon programme en prenant soin de n'avoir qu'un seul niveau d'indentation. A noter que j'utilise la version 3.5 de python. Est ce que quelqu'un aurait une idée du problème?

Merci d'avance pour les suggestions :)

+0 -0

Salut,

Tu suis probablement le cours de Python d'OpenClassrooms. Ce cours comporte de nombreuses erreurs, déjà relevées à plusieurs reprises, mais qui malheureusement je pense ne seront jamais corrigées.
Il continue d'être mis en avant par OC et d'induire ses lecteurs en erreur, il faut ensuite rattraper les dégâts :)

Il ne s'agit pas d'un problème d'indentation, mais un problème dans le code donné par le cours. Ligne 15, l'appel à object.__new__ (qui devrait préférablement être remplacé par super().__new__) se fait en lui passant les valeurs nom et prenom, alors que cette méthode de classe ne prend aucun autre paramètre que cls.

Attention aussi, tu as retiré le return initialement présent dans la méthode __new__ de Personne. Sans return, None sera retournée, et tu ne récupéreras donc jamais les instances de Personne créées.

Remplace donc la ligne 15 par return super().__new__(cls), et ton problème sera résolu. Mais pour le résoudre sur le long terme, appuie-toi sur un cours moins erroné.
Edit : en fait le cours de Swinnen ne semble pas traiter des métaclasses :/

Édité par entwanne

Auteur du sujet

Merci beaucoup amis zestes! :)

Effectivement Entwanne je suis le tuto sur OC, et j'ai enlevé le return par mégarde. Merci pour le lien du cours, j'avais déjà remarqué son cours sur developpez.com et comme tu me fais comprendre que c'est un excellent cours, je vais y jeter un oeil après avoir terminé celui-ci.

Bon weekend à vous

+0 -0
Staff

Bon après honnêtement, __new__ et les metaclasse ce n'est pas ce qui sert le plus souvent. Pratiquer Python est plus important que s'intéresser à ces détails avancés qui ne te servirons probablement jamais.

+3 -0
Staff

Ça ne m'étonne pas trop que le cours de Swinnen n'aborde pas les métaclasses : c'est vraiment une notion dont on n'a jamais besoin d'ordinaire (en 8 ans de pratique quotidienne, j'ai dû utiliser 2 fois cette feature en tout dans du vrai code).

La meilleure ressource sur le sujet que je connaisse est cette réponse sur StackOverflow.

Édité par nohar

I was a llama before it was cool

+4 -0

Ça ne m'étonne pas trop que le cours de Swinnen n'aborde pas les métaclasses : c'est vraiment une notion dont on n'a jamais besoin d'ordinaire (en 8 ans de pratique quotidienne, j'ai dû utiliser 2 fois cette feature en tout dans du vrai code).

nohar

C'est pas que je lui reproche de ne pas aborder ce sujet, mais j'étais persuadé qu'il couvrait tout le langage. À ma décharge, ça fait plus de 5 ans que je l'ai lu, et je ne l'ai jamais terminé :)

Staff

Si j'étais toi j'ignorerai cette partie. Passe plutôt du temps à créer quelque chose en Python, réalise des programmes ou des sites web. La pratique te sera beaucoup plus utile que d'apprendre à utiliser ça. D'autant que les connaitre entraîne un gros risque : les utiliser. J'ai souvent vue des mauvaises utilisation de __new__ et des méta-classes.

+5 -0
Staff

Le seul inconvénient de scapy, c'est qu'il est réservé à Python 2 et pas près d'être porté.

Après, tout dépend de la portée du sniffer en question (l'objectif de perfs en particulier), mais je crois que si je voulais faire un sniffer aujourd'hui je chercherais plutôt un binding pour la lib pcap compatible Python3, quitte à réinventer la roue pour le fun. :)

Édité par nohar

I was a llama before it was cool

+0 -0
Auteur du sujet

Je connais scapy Juke

et Nohar, il y a quelqu'un qui a travaillé sur une mise à niveau de Scapy sur python 3, c'est ici https://github.com/phaethon/scapy

Moi je veux le refaire moi-même, d'abord parce que c'est un challenge, et je trouve que j'apprendrais plus comment les protocoles marchent si je le fais moi-même. En plus j'évolue dans le domaine des réseaux et télécoms, donc ce sera un plus à mon CV :)

+0 -0

Moi je veux le refaire moi-même, d'abord parce que c'est un challenge, et je trouve que j'apprendrais plus comment les protocoles marchent si je le fais moi-même. En plus j'évolue dans le domaine des réseaux et télécoms, donc ce sera un plus à mon CV :)

lewoudar

tu fais quoi dans les telco ?

+0 -0
Auteur du sujet

Je suis en dernière année d'études, disons que ma formation s'articule autour de la conception architecture et réseaux télécoms / informatique. Moi je recherche dans la R&D actuellement pour travailler sur des nouvelles technologies comme le cloud ou l'internet des objets

+0 -0

Tu sais que le cloud ça veut pas dire grand chose, c'est le nuage qu'on dessinait au tableau pour leur faire comprendre "internet" et les commerciaux ont reussi à mettre un nom dessus et à le (re)vendre.

+0 -0
Staff

Oui et non : ça désigne quand même un système (massivement) partagé entre plusieurs machines en réseau, mais ça reste volontairement vague pour être applicable à un peu tous les domaines.

I was a llama before it was cool

+0 -0
Staff

Au passage la hype autour de l'internet des objets reste aussi à démontrer. Même Apple n'arrive pas à imposer sa montre, alors votre brosse à dent ou votre lit connecté vendu par une start-up…

+3 -0

L'IoT c'est pas applicable qu'au particulier et j'ai meme envie de dire que les premiers beneficiaires se seront les compagnies et les entites publiques.

Cela fait 10 ans que l'IoT 'locale' existe a des echelles comme des sites industriels et on peut penser a des utilisations pour reconfigurer certaines parties du reseau routier en direct a partir d'objets connectes aussi divers que les feux tricolores, les stations de mesure de pollution, etc.

A mon avis, la hype autour des gadgets connectes pour le grand public cache une mine d'or de solutions a des problematiques tres actuelles, environnementales par exemple.

+1 -0
Auteur du sujet

Bonsoir à vous,

Bon juke quand tu dis que le cloud c'est vague, tu as raison, je n'ai pas voulu entrer dans les détails pour ne pas perdre les néophytes. Quand je parle de travailler dans le cloud, je vise les technos qui font le cloud comme OpenStack, OS cloud écrit en python (vive Python!).

Bon j'en aurais un rayon à dire (vu que je ne suis pas tout à fait d'accord avec ce qui est dit sur l'IOT), mais je vous fais remarquer qu'on s'écarte largement du sujet de base qui a été résolu, et que les admins comme Nohar ne vont pas trop apprécier :p Si vous voulez en discuter, je vous propose d'ouvrir un autre sujet.

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte