TypeError: module .__ init __ () accetta al massimo 2 argomenti (3 indicati)


147

Ho definito una classe in un file denominato Object.py. Quando provo a ereditare da questa classe in un altro file, la chiamata al costruttore genera un'eccezione:

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

Questo è il mio codice:

import Object

class Visitor(Object):
    pass

instance = Visitor()  # this line throws the exception

Che cosa sto facendo di sbagliato?


1
Potresti selezionare la risposta fornita? Sembra essere corretto e permetterà ad altre domande di essere chiuse come tue.
Fisico pazzo,

1
Ehi, @wakamdr, la funzionalità della domanda duplicata è piuttosto utile. C'è un motivo per cui la mia risposta non è corretta?
Sheena,

Non è necessario accettare una risposta affinché altre domande vengano duplicate come duplicate di questa.
user2357112 supporta Monica il

Risposte:


237

Il tuo errore si sta verificando perché Objectè un modulo, non una classe. Quindi la tua eredità è sbagliata.

Cambia la tua dichiarazione di importazione in:

from Object import ClassName

e la definizione della tua classe per:

class Visitor(ClassName):

o

cambia la definizione della tua classe in:

class Visitor(Object.ClassName):
   etc

Funzionerà allo stesso modo, se si omette ClassNamecompletamente? Come class Visitor()?
VMAtm

1
@VMAtm: Perché non provarlo e scoprirlo. Python è fantastico perché ha l'interprete. Ottimo per una rapida sperimentazione
Sheena,

2
Genio. peggior errore nel mondo. mi ci sono volute 3 ore per capire che stavo usando il modulo e non la classe. # $% ^ $% & $% &
Mickey Perlstein il

Per rendere questo più chiaro per gli utenti Java, il file è Object e la classe è ClassName. In Python un file è un modulo e le definizioni di classe all'interno del file sono le classi.
Kelly Bang,

6

Anche dopo la risposta di @Mickey Perlstein e le sue 3 ore di lavoro investigativo, mi ci sono voluti ancora alcuni minuti per applicare questo al mio pasticcio. Nel caso in cui qualcun altro sia come me e abbia bisogno di un po 'più di aiuto, ecco cosa stava succedendo nella mia situazione.

  • risposte è un modulo
  • La risposta è una classe di base all'interno del modulo risposte
  • GeoJsonResponse è una nuova classe derivata da Response

Classe iniziale GeoJsonResponse:

from pyexample.responses import Response

class GeoJsonResponse(Response):

    def __init__(self, geo_json_data):

Sembra a posto. Nessun problema fino a quando non provi a eseguire il debug della cosa, ovvero quando ricevi un sacco di messaggi di errore apparentemente vaghi come questo:

da pyexample.responses importa GeoJsonResponse .. \ pyexample \ responses \ GeoJsonResponse.py: 12: nella classe (modulo) GeoJsonResponse (Response):

E TypeError: module () accetta al massimo 2 argomenti (3 forniti)

=================================== ERRORI ============== ======================

___________________ ERRORE raccolta test / test_geojson.py ____________________

test_geojson.py:2: in (modulo) da pyexample.responses import GeoJsonResponse .. \ pyexample \ responses \ GeoJsonResponse.py: 12: in (modulo)

class GeoJsonResponse (Response): E TypeError: module () accetta al massimo 2 argomenti (3 forniti)

ERRORE: non trovato: \ PyExample \ tests \ test_geojson.py :: TestGeoJson :: test_api_response

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

(nessun nome "PyExample \ tests \ test_geojson.py :: TestGeoJson :: test_api_response" in nessuno dei [])

Gli errori stavano facendo del loro meglio per indicarmi la giusta direzione, e la risposta di @Mickey Perlstein era morta, mi ci è voluto solo un minuto per mettere tutto insieme nel mio contesto:

Stavo importando il modulo :

from pyexample.responses import Response

quando avrei dovuto importare la classe :

from pyexample.responses.Response import Response

Spero che questo aiuti qualcuno. (A mia difesa, è ancora piuttosto presto.)


come è collegato alla domanda?
Leevi L

3

Puoi anche fare quanto segue in Python 3.6.1

from Object import Object as Parent

e la definizione della tua classe per:

class Visitor(Parent):

2
from Object import Object

o

From Class_Name import Class_name

Se Object è un .pyfile.


0

Nel mio caso in cui avevo il problema mi riferivo a un modulo quando ho provato ad estendere la classe.

import logging
class UserdefinedLogging(logging):

Se guardi le informazioni sulla documentazione, vedrai "logging" visualizzato come modulo.

In questo caso specifico ho dovuto semplicemente ereditare il modulo di registrazione per creare una classe aggiuntiva per la registrazione.


Questo può essere considerato un commento, non una risposta. Rispondi solo se pensi che risolverà il problema.
Hamza Khurshid,

Mi dispiace per quello. Sono nuovo ad usare attivamente StackOverflow e non ho familiarità con la netiquette del sito.
Gerardsson,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.