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?


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

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.)


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):

2
from Object import Object

lub

From Class_Name import Class_name

Jeśli Object jest .pyplikiem.


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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.