TypeError: module .__ init __ () przyjmuje co najwyżej 2 argumenty (podane 3)

147

Zdefiniowałem klasę w pliku o nazwie Object.py. Kiedy próbuję dziedziczyć z tej klasy w innym pliku, wywołanie konstruktora zgłasza wyjątek:

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

To jest mój kod:

import Object

class Visitor(Object):
    pass

instance = Visitor()  # this line throws the exception

Co ja robię źle?

lobjc
źródło
1
Czy mógłbyś wybrać udzieloną odpowiedź? Wydaje się, że jest poprawny i pozwoli na zamknięcie innych pytań jako naiwniaków.
Mad Physicist
1
Hej @wakamdr, funkcja zduplikowanych pytań jest całkiem przydatna. Czy istnieje powód, dla którego moja odpowiedź jest nieprawidłowa?
Sheena
Odpowiedź nie musi być zaakceptowana, aby inne pytania zostały zamknięte jako duplikaty tego pytania.
user2357112 obsługuje Monikę

Odpowiedzi:

237

Twój błąd występuje, ponieważ Objectjest to moduł, a nie klasa. Więc twoje dziedzictwo jest skomplikowane.

Zmień zestawienie importu na:

from Object import ClassName

i definicję klasy, aby:

class Visitor(ClassName):

lub

zmień definicję klasy na:

class Visitor(Object.ClassName):
   etc
Sheena
źródło
Czy będzie działać tak samo, jeśli ClassNamecałkowicie pominiemy ? Lubisz class Visitor()?
VMAtm,
1
@VMAtm: Dlaczego nie spróbujesz tego i się przekonasz. Świetny, bo Pythona ma interpretera. Świetne do szybkich eksperymentów
Sheena
2
Geniusz. najgorsza linia błędu na świecie. zajęło mi 3 godziny zorientowanie się, że korzystam z modułu, a nie z zajęć. # $% ^ $% & $% &
Mickey Perlstein
Aby było to bardziej zrozumiałe dla użytkowników języka Java, plik to Object, a klasa to ClassName. W Pythonie plik jest modułem, a definicje klas w pliku to klasy.
Kelly Bang
6

Nawet po odpowiedzi @Mickey Perlstein i jego 3-godzinnej pracy detektywistycznej zajęło mi jeszcze kilka minut, zanim zastosowałem to do własnego bałaganu. Na wypadek, gdyby ktoś był podobny do mnie i potrzebuje trochę więcej pomocy, oto co działo się w mojej sytuacji.

  • responses to moduł
  • Response to klasa bazowa w module responses
  • GeoJsonResponse to nowa klasa wywodząca się z Response

Początkowa klasa GeoJsonResponse:

from pyexample.responses import Response

class GeoJsonResponse(Response):

    def __init__(self, geo_json_data):

Wygląda w porządku. Żadnych problemów, dopóki nie spróbujesz debugować, co dzieje się, gdy pojawia się kilka pozornie niejasnych komunikatów o błędach, takich jak ten:

from pyexample.responses import GeoJsonResponse .. \ pyexample \ responses \ GeoJsonResponse.py: 12: in (module) class GeoJsonResponse (Response):

E TypeError: module () przyjmuje co najwyżej 2 argumenty (podane 3)

=================================== BŁĘDY ============== ======================

___________________ BŁĄD podczas zbierania testów / test_geojson.py ____________________

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

class GeoJsonResponse (Response): E TypeError: module () przyjmuje co najwyżej 2 argumenty (podane 3)

BŁĄD: nie znaleziono: \ PyExample \ tests \ test_geojson.py :: TestGeoJson :: test_api_response

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

(brak nazwy „PyExample \ tests \ test_geojson.py :: TestGeoJson :: test_api_response” w żadnym z [])

Błędy robiły wszystko, co w ich mocy, aby wskazać mi właściwy kierunek, a odpowiedź @Mickey Perlstein była martwa, zajęło mi tylko minutę, aby zebrać to wszystko w moim własnym kontekście:

Importowałem moduł :

from pyexample.responses import Response

kiedy powinienem był importować klasę :

from pyexample.responses.Response import Response

Mam nadzieję, że to komuś pomoże. (W mojej obronie jest jeszcze dość wcześnie.)

SunfiShie
źródło
jak to się ma do pytania?
Leevi L
3

Możesz także wykonać następujące czynności w Pythonie 3.6.1

from Object import Object as Parent

i definicję klasy, aby:

class Visitor(Parent):
Anthony Rutledge
źródło
2
from Object import Object

lub

From Class_Name import Class_name

Jeśli Object jest .pyplikiem.

Divesh Singh
źródło
0

W moim przypadku, w którym miałem problem, odnosiłem się do modułu, gdy próbowałem rozszerzyć klasę.

import logging
class UserdefinedLogging(logging):

Jeśli spojrzysz na informacje o dokumentacji, zobaczysz „logowanie” wyświetlane jako moduł.

W tym konkretnym przypadku musiałem po prostu odziedziczyć moduł logowania, aby utworzyć dodatkową klasę do logowania.

Gerardsson
źródło
Można to uznać za komentarz, a nie odpowiedź. Odpowiedz tylko, jeśli uważasz, że to rozwiąże problem.
Hamza Khurshid
Przepraszam za to. Jestem nowy w aktywnym korzystaniu ze stackoverflow i nie znam netykiety tej witryny.
Gerardsson