TypeError: module .__ init __ () toma como máximo 2 argumentos (3 dados)

147

He definido una clase en un archivo llamado Object.py. Cuando trato de heredar de esta clase en otro archivo, llamar al constructor arroja una excepción:

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

Este es mi código:

import Object

class Visitor(Object):
    pass

instance = Visitor()  # this line throws the exception

¿Qué estoy haciendo mal?

lobjc
fuente
1
¿Podría seleccionar la respuesta proporcionada? Parece ser correcto y permitirá que otras preguntas sean cerradas como engaños tuyos.
Físico loco
1
Hola @wakamdr, la funcionalidad de preguntas duplicadas es bastante útil. ¿Hay alguna razón por la cual mi respuesta no es correcta?
Sheena
No es necesario aceptar una respuesta para que otras preguntas sean cerradas como duplicados de esta.
user2357112 es compatible con Monica el

Respuestas:

237

Su error está sucediendo porque Objectes un módulo, no una clase. Entonces, tu herencia es desastrosa.

Cambie su declaración de importación a:

from Object import ClassName

y su definición de clase para:

class Visitor(ClassName):

o

cambie su definición de clase a:

class Visitor(Object.ClassName):
   etc
Sheena
fuente
¿Funcionará igual si se omite por ClassNamecompleto? Al igual que class Visitor()?
VMAtm
1
@VMAtm: ¿Por qué no lo intentas y lo descubres? Python es genial porque tiene el intérprete. Genial para la experimentación rápida
Sheena
2
Genio. peor línea de error en el mundo. Me tomó 3 horas descubrir que estaba usando el módulo y no la clase. # $% ^ $% & $% &
Mickey Perlstein
Para que esto sea más claro para los usuarios de Java, el archivo es Object y la clase es ClassName. En Python, un archivo es un módulo y las definiciones de clase dentro del archivo son las clases.
Kelly Bang
6

Incluso después de la respuesta de @Mickey Perlstein y sus 3 horas de trabajo de detective, todavía me tomó unos minutos más aplicar esto a mi propio desastre. En caso de que alguien más sea como yo y necesite un poco más de ayuda, esto es lo que estaba sucediendo en mi situación.

  • respuestas es un módulo
  • La respuesta es una clase base dentro del módulo de respuestas
  • GeoJsonResponse es una nueva clase derivada de Response

Clase inicial GeoJsonResponse:

from pyexample.responses import Response

class GeoJsonResponse(Response):

    def __init__(self, geo_json_data):

Se ve bien. No hay problemas hasta que intente depurar el problema, que es cuando recibe un montón de mensajes de error aparentemente vagos como este:

from pyexample.responses import GeoJsonResponse .. \ pyexample \ answers \ GeoJsonResponse.py: 12: en la clase (módulo) GeoJsonResponse (Response):

E TypeError: module () toma como máximo 2 argumentos (3 dados)

=================================== ERRORES ============== ======================

___________________ ERROR al recopilar pruebas / test_geojson.py ____________________

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

class GeoJsonResponse (Response): E TypeError: module () toma como máximo 2 argumentos (3 dados)

ERROR: no encontrado: \ PyExample \ tests \ test_geojson.py :: TestGeoJson :: test_api_response

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

(sin nombre 'PyExample \ tests \ test_geojson.py :: TestGeoJson :: test_api_response' en ninguno de [])

Los errores hicieron todo lo posible para señalarme en la dirección correcta, y la respuesta de @Mickey Perlstein fue acertada, solo me llevó un minuto poner todo junto en mi propio contexto:

Estaba importando el módulo :

from pyexample.responses import Response

cuando debería haber estado importando la clase :

from pyexample.responses.Response import Response

Espero que esto ayude a alguien. (En mi defensa, todavía es bastante temprano).

SunfiShie
fuente
¿Cómo se relaciona esto con la pregunta?
Leevi L
3

También puede hacer lo siguiente en Python 3.6.1

from Object import Object as Parent

y su definición de clase para:

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

o

From Class_Name import Class_name

Si Object es un .pyarchivo.

Divesh singh
fuente
0

En mi caso donde tuve el problema, me refería a un módulo cuando intenté extender la clase.

import logging
class UserdefinedLogging(logging):

Si observa la Información de la documentación, verá el "registro" como módulo.

En este caso específico, simplemente tuve que heredar el módulo de registro para crear una clase adicional para el registro.

Gerardsson
fuente
Esto puede calificar como un comentario, no como respuesta. Solo responda si cree que resolverá el problema.
Hamza Khurshid
Lo siento por eso. Soy nuevo en el uso activo de stackoverflow y no estoy tan familiarizado con la netiquette del sitio.
Gerardsson