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.