TypeError: module .__ init __ () prend au plus 2 arguments (3 donnés)

147

J'ai défini une classe dans un fichier nommé Object.py . Lorsque j'essaie d'hériter de cette classe dans un autre fichier, l'appel du constructeur lève une exception:

TypeError: module.__init__() takes at most 2 arguments (3 given)

Voici mon code:

import Object

class Visitor(Object):
    pass

instance = Visitor()  # this line throws the exception

Qu'est-ce que je fais mal?

lobjc
la source
1
Pourriez-vous s'il vous plaît sélectionner la réponse fournie? Cela semble correct et permettra de fermer d'autres questions comme des dupes de la vôtre.
Mad Physicist
1
Hey @wakamdr, la fonctionnalité de question en double est très utile. Y a-t-il une raison pour laquelle ma réponse n'est pas correcte?
Sheena
Une réponse n'a pas besoin d'être acceptée pour que d'autres questions soient dupes comme des doublons de celle-ci.
user2357112 prend en charge Monica le

Réponses:

237

Votre erreur se produit parce que Objectc'est un module, pas une classe. Donc, votre héritage est foutu.

Modifiez votre déclaration d'importation en:

from Object import ClassName

et votre définition de classe pour:

class Visitor(ClassName):

ou

changez votre définition de classe en:

class Visitor(Object.ClassName):
   etc
Sheena
la source
Est-ce que ça marche de la même façon, si on omet ClassNamecomplètement? Comme class Visitor()?
VMAtm
1
@VMAtm: Pourquoi ne pas l'essayer et le découvrir. Le grand parce que Python a l'interpréteur. Idéal pour une expérimentation rapide
Sheena
2
Génie. la pire ligne d'erreur au monde. m'a pris 3 heures pour comprendre que j'utilisais le module et non la classe. # $% ^ $% & $% &
Mickey Perlstein
Pour rendre cela plus clair pour les utilisateurs Java, le fichier est Object et la classe est ClassName. En Python, un fichier est un module et la ou les définitions de classe à l'intérieur du fichier sont les classes.
Kelly Bang
6

Même après la réponse de @Mickey Perlstein et ses 3 heures de travail de détective, il m'a fallu encore quelques minutes pour appliquer cela à mon propre désordre. Au cas où quelqu'un d'autre serait comme moi et aurait besoin d'un peu plus d'aide, voici ce qui se passait dans ma situation.

  • réponses est un module
  • La réponse est une classe de base dans le module de réponses
  • GeoJsonResponse est une nouvelle classe dérivée de Response

Classe GeoJsonResponse initiale:

from pyexample.responses import Response

class GeoJsonResponse(Response):

    def __init__(self, geo_json_data):

Semble bien. Aucun problème jusqu'à ce que vous essayiez de déboguer le problème, c'est-à-dire lorsque vous obtenez un tas de messages d'erreur apparemment vagues comme celui-ci:

from pyexample.responses import GeoJsonResponse .. \ pyexample \ answers \ GeoJsonResponse.py: 12: dans la classe (module) GeoJsonResponse (Response):

E TypeError: module () prend au plus 2 arguments (3 donnés)

==================================== ERREURS ============== =======================

___________________ ERREUR lors de la collecte des tests / test_geojson.py ____________________

test_geojson.py:2: in (module) from pyexample.responses import GeoJsonResponse .. \ pyexample \ answers \ GeoJsonResponse.py: 12: in (module)

class GeoJsonResponse (Response): E TypeError: module () prend au plus 2 arguments (3 donnés)

ERREUR: introuvable: \ PyExample \ tests \ test_geojson.py :: TestGeoJson :: test_api_response

C: \ Python37 \ lib \ site-packages \ aenum__init __. Py: 163

(pas de nom 'PyExample \ tests \ test_geojson.py :: TestGeoJson :: test_api_response' dans l'un des [])

Les erreurs faisaient de leur mieux pour me diriger dans la bonne direction, et la réponse de @Mickey Perlstein était morte, il ne m'a fallu qu'une minute pour tout mettre en place dans mon propre contexte:

J'importais le module :

from pyexample.responses import Response

quand j'aurais dû importer la classe :

from pyexample.responses.Response import Response

J'espère que cela aide quelqu'un. (Pour ma défense, il est encore assez tôt.)

SunfiShie
la source
comment est-ce lié à la question?
Leevi L
3

Vous pouvez également effectuer les opérations suivantes dans Python 3.6.1

from Object import Object as Parent

et votre définition de classe pour:

class Visitor(Parent):
Anthony Rutledge
la source
2
from Object import Object

ou

From Class_Name import Class_name

Si Object est un .pyfichier.

Divesh singh
la source
0

Dans mon cas où j'ai eu le problème, je faisais référence à un module lorsque j'ai essayé d'étendre la classe.

import logging
class UserdefinedLogging(logging):

Si vous regardez les informations sur la documentation, vous verrez «journalisation» affiché en tant que module.

Dans ce cas précis, je devais simplement hériter du module de journalisation pour créer une classe supplémentaire pour la journalisation.

Gerardsson
la source
Cela peut être considéré comme un commentaire, pas comme une réponse. Veuillez ne répondre que si vous pensez que cela résoudra le problème.
Hamza Khurshid
Désolé pour ça. Je suis nouveau dans l'utilisation active de stackoverflow et je ne suis pas très familier avec la nétiquette du site.
Gerardsson le