TypeError: module .__ init __ () leva no máximo 2 argumentos (3 dados)


147

Eu defini uma classe em um arquivo chamado Object.py. Quando tento herdar dessa classe em outro arquivo, chamar o construtor lança uma exceção:

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

Este é o meu código:

import Object

class Visitor(Object):
    pass

instance = Visitor()  # this line throws the exception

O que estou fazendo de errado?


1
Poderia, por favor, selecionar a resposta fornecida? Parece estar correto e permitirá que outras perguntas sejam encerradas como suas.
— Físico louco

1
Hey @wakamdr, a funcionalidade de perguntas duplicadas é bastante útil. Existe uma razão pela qual minha resposta não está correta?
— Sheena

Uma resposta não precisa ser aceita para que outras perguntas sejam fechadas como duplicatas.
— User2357112 suporta Monica

Respostas:


237

Seu erro está acontecendo porque Objecté um módulo, não uma classe. Portanto, sua herança é esquisita.

Altere sua declaração de importação para:

from Object import ClassName

e sua definição de classe para:

class Visitor(ClassName):

ou

altere sua definição de classe para:

class Visitor(Object.ClassName):
   etc

Será que funciona da mesma maneira, se alguém omitir ClassNamecompletamente? Gosta class Visitor()?
— VMAtm 24/01

1
@VMAtm: Por que você não tenta e descobre. O ótimo cos do Python, ele tem o intérprete. Ótimo para experimentação rápida
— Sheena

2
Gênio. pior linha de erro do mundo. Levei 3 horas para descobrir que eu estava usando o módulo e não a classe. # $% ^ $% & $% &
— Mickey Perlstein

Para deixar isso mais claro para usuários de Java, o arquivo é Object e a classe é ClassName. No Python, um arquivo é um módulo e as definições de classe dentro do arquivo são as classes.
— Kelly Bang

6

Mesmo após a resposta de @Mickey Perlstein e suas 3 horas de trabalho de detetive, ainda levei mais alguns minutos para aplicar isso à minha própria bagunça. Caso alguém seja como eu e precise de um pouco mais de ajuda, eis o que estava acontecendo na minha situação.

  • respostas é um módulo
  • Response é uma classe base dentro do módulo de respostas
  • GeoJsonResponse é uma nova classe derivada de Response

Classe inicial GeoJsonResponse:

from pyexample.responses import Response

class GeoJsonResponse(Response):

    def __init__(self, geo_json_data):

Parece bem. Sem problemas até você tentar depurar a coisa, que é quando você recebe um monte de mensagens de erro aparentemente vagas como esta:

from pyexample.responses import GeoJsonResponse .. \ pyexample \ answers \ GeoJsonResponse.py: 12: na classe (do módulo) GeoJsonResponse (Response):

E TypeError: module () recebe no máximo 2 argumentos (3 dados)

=================================== ERROS ============== ======================

___________________ ERRO ao coletar testes / test_geojson.py ____________________

test_geojson.py:2: in (módulo) de pyexample.responses importa GeoJsonResponse .. \ pyexample \ answers \ GeoJsonResponse.py: 12: in (módulo)

classe GeoJsonResponse (Response): E TypeError: module () leva no máximo 2 argumentos (3 dados)

ERRO: não encontrado: \ PyExample \ tests \ test_geojson.py :: TestGeoJson :: test_api_response

C: \ Python37 \ lib \ pacotes de sites \ aenum__init __. Py: 163

(nenhum nome 'PyExample \ tests \ test_geojson.py :: TestGeoJson :: test_api_response' em qualquer um dos [])

Os erros estavam fazendo o possível para me apontar na direção certa, e a resposta de @Mickey Perlstein estava morta, levei apenas um minuto para reunir tudo no meu próprio contexto:

Eu estava importando o módulo :

from pyexample.responses import Response

quando eu deveria estar importando a classe :

from pyexample.responses.Response import Response

Espero que isso ajude alguém. (Em minha defesa, ainda é muito cedo.)


como isso está relacionado à questão?
— precisa saber é o seguinte

3

Você também pode fazer o seguinte no Python 3.6.1

from Object import Object as Parent

e sua definição de classe para:

class Visitor(Parent):

2
from Object import Object

ou

From Class_Name import Class_name

Se Object é um .pyarquivo.


0

No meu caso em que tive o problema, estava me referindo a um módulo quando tentei estender a classe.

import logging
class UserdefinedLogging(logging):

Se você olhar as Informações da documentação, verá "log" exibido como módulo.

Nesse caso específico, tive que simplesmente herdar o módulo de log para criar uma classe extra para o log.


Isso pode ser qualificado como um comentário, não como resposta. Por favor, responda apenas se você acha que vai resolver o problema.
— Hamza Khurshid 15/04

Me desculpe por isso. Eu sou novo no uso ativo do stackoverflow e não estou familiarizado com a netiqueta do site.
— Gerardsson 20/04
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.