TypeError: Modul .__ init __ () akzeptiert höchstens 2 Argumente (3 angegeben)

147

Ich habe eine Klasse in einer Datei mit dem Namen definiert Object.py. Wenn ich versuche, von dieser Klasse in einer anderen Datei zu erben, löst der Aufruf des Konstruktors eine Ausnahme aus:

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

Das ist mein Code:

import Object

class Visitor(Object):
    pass

instance = Visitor()  # this line throws the exception

Was mache ich falsch?

lobjc
quelle
1
Könnten Sie bitte die Antwort auswählen? Es scheint korrekt zu sein und ermöglicht es, andere Fragen als Ihre Dupes zu schließen.
Mad Physicist
1
Hey @wakamdr, die Funktion für doppelte Fragen ist ziemlich nützlich. Gibt es einen Grund, warum meine Antwort nicht korrekt ist?
Sheena
Eine Antwort muss nicht akzeptiert werden, damit andere Fragen als Duplikate dieser Frage betrogen werden.
user2357112 unterstützt Monica

Antworten:

237

Ihr Fehler tritt auf, weil Objectes sich um ein Modul handelt, nicht um eine Klasse. Ihr Erbe ist also verrückt.

Ändern Sie Ihre Importanweisung in:

from Object import ClassName

und Ihre Klassendefinition zu:

class Visitor(ClassName):

oder

Ändern Sie Ihre Klassendefinition in:

class Visitor(Object.ClassName):
   etc
Sheena
quelle
Wird es gleich funktionieren, wenn man ClassNameganz weglässt ? Wie class Visitor()?
VMAtm
1
@ VMAtm: Warum versuchst du es nicht und findest es heraus? Python ist großartig, weil es den Interpreter hat. Ideal für schnelles Experimentieren
Sheena
2
Genius. schlimmste Fehlerlinie der Welt. Ich habe 3 Stunden gebraucht, um herauszufinden, dass ich das Modul und nicht die Klasse verwendet habe. # $% ^ $% & $% &
Mickey Perlstein
Um dies für Java-Benutzer klarer zu machen, lautet die Datei Object und die Klasse ClassName. In Python ist eine Datei ein Modul und die Klassendefinition (en) in der Datei sind die Klassen.
Kelly Bang vor
6

Selbst nach @Mickey Perlsteins Antwort und seiner 3-stündigen Detektivarbeit brauchte ich noch ein paar Minuten, um dies auf mein eigenes Durcheinander anzuwenden. Falls jemand wie ich ist und etwas mehr Hilfe benötigt, ist hier, was in meiner Situation vor sich ging.

  • Antworten ist ein Modul
  • Antwort ist eine Basisklasse innerhalb des Antwortmoduls
  • GeoJsonResponse ist eine neue Klasse, die von Response abgeleitet ist

Anfängliche GeoJsonResponse-Klasse:

from pyexample.responses import Response

class GeoJsonResponse(Response):

    def __init__(self, geo_json_data):

Sieht gut aus. Keine Probleme, bis Sie versuchen, das Ding zu debuggen. Dann erhalten Sie eine Reihe von scheinbar vagen Fehlermeldungen wie diese:

aus pyexample.responses importieren Sie GeoJsonResponse .. \ pyexample \ answers \ GeoJsonResponse.py: 12: in (Modul-) Klasse GeoJsonResponse (Antwort):

E TypeError: module () akzeptiert höchstens 2 Argumente (3 angegeben)

=================================== FEHLER ============== ======================

___________________ FEHLER beim Sammeln von Tests / test_geojson.py ____________________

test_geojson.py:2: in (Modul) aus pyexample.responses importieren GeoJsonResponse .. \ pyexample \ answers \ GeoJsonResponse.py: 12: in (Modul)

Klasse GeoJsonResponse (Antwort): E TypeError: module () akzeptiert höchstens 2 Argumente (3 angegeben)

FEHLER: nicht gefunden: \ PyExample \ tests \ test_geojson.py :: TestGeoJson :: test_api_response

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

(Kein Name 'PyExample \ tests \ test_geojson.py :: TestGeoJson :: test_api_response' in einem von [])

Die Fehler haben ihr Bestes getan, um mich in die richtige Richtung zu weisen, und @Mickey Perlsteins Antwort war tot. Ich brauchte nur eine Minute, um alles in meinem eigenen Kontext zusammenzustellen:

Ich habe das Modul importiert :

from pyexample.responses import Response

wann ich die Klasse hätte importieren sollen :

from pyexample.responses.Response import Response

Hoffe das hilft jemandem. (Zu meiner Verteidigung ist es noch ziemlich früh.)

SunfiShie
quelle
Wie hängt das mit der Frage zusammen?
Leevi L
3

Sie können in Python 3.6.1 auch Folgendes tun

from Object import Object as Parent

und Ihre Klassendefinition zu:

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

oder

From Class_Name import Class_name

Wenn Objekt eine .pyDatei ist.

Divesh Singh
quelle
0

In meinem Fall, in dem ich das Problem hatte, bezog ich mich auf ein Modul, als ich versuchte, die Klasse zu erweitern.

import logging
class UserdefinedLogging(logging):

Wenn Sie sich die Dokumentationsinformationen ansehen, wird "Protokollierung" als Modul angezeigt.

In diesem speziellen Fall musste ich einfach das Protokollierungsmodul erben, um eine zusätzliche Klasse für die Protokollierung zu erstellen.

Gerardsson
quelle
Dies kann als Kommentar und nicht als Antwort gelten. Bitte antworten Sie nur, wenn Sie glauben, dass dies das Problem lösen wird.
Hamza Khurshid
Das tut mir leid. Ich bin neu in der aktiven Nutzung von Stackoverflow und mit der Netiquette der Site nicht so vertraut.
Gerardsson