Ошибка типа: модуль .__ init __ () принимает не более 2 аргументов (3 дано)


147

Я определил класс в файле с именем Object.py. Когда я пытаюсь наследовать от этого класса в другом файле, вызов конструктора вызывает исключение:

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

Это мой код:

import Object

class Visitor(Object):
    pass

instance = Visitor()  # this line throws the exception

Что я делаю не так?


1
Не могли бы вы выбрать ответ? Похоже, что это правильно, и другие вопросы будут закрыты как ваши собственные.
Безумный физик

1
Эй, @wakamdr, функция дублирования вопросов довольно полезна. Есть ли причина, по которой мой ответ неверен?
Шина

Ответ не должен быть принят для других вопросов, которые будут дублироваться как дубликаты этого.
user2357112 поддерживает Monica

Ответы:


237

Ваша ошибка происходит потому, что Objectэто модуль, а не класс. Значит, твое наследство пошло не так.

Измените свое заявление на импорт на:

from Object import ClassName

и ваше определение класса:

class Visitor(ClassName):

или

измените определение своего класса на:

class Visitor(Object.ClassName):
   etc

Будет ли это работать так же, если ClassNameполностью пропустить ? Как class Visitor()?
VMAtm

1
@VMAtm: Почему бы вам не попробовать и выяснить. Отличный Python, потому что у него есть переводчик. Отлично
Шина

2
Genius. худшая ошибка в мире. Мне потребовалось 3 часа, чтобы понять, что я использую модуль, а не класс. # $% ^ $% & $% &
Микки Перлштейн

Чтобы сделать это более понятным для пользователей Java, файл - Object, а класс - ClassName. В Python файл - это модуль, а определения классов внутри файла - это классы.
Келли Банг

6

Даже после ответа @Mickey Perlstein и его 3 часов детективной работы, мне все еще потребовалось еще несколько минут, чтобы применить это в моем собственном беспорядке. Если кто-то похож на меня и нуждается в дополнительной помощи, вот что происходит в моей ситуации.

  • Отзывы это модуль
  • Ответ - это базовый класс в модуле ответов.
  • GeoJsonResponse - это новый класс, производный от Response

Начальный класс GeoJsonResponse:

from pyexample.responses import Response

class GeoJsonResponse(Response):

    def __init__(self, geo_json_data):

Выглядит хорошо. Нет проблем, пока вы не попытаетесь отладить эту вещь, когда вы получаете кучу, казалось бы, расплывчатых сообщений об ошибках вроде этого:

из pyexample.responses import GeoJsonResponse .. \ pyexample \ response \ GeoJsonResponse.py: 12: в (модуль) класс GeoJsonResponse (Response):

E TypeError: module () принимает не более 2 аргументов (3 дано)

=================================== ОШИБКИ ============== ======================

___________________ ОШИБКА, собирающая тесты / test_geojson.py ____________________

test_geojson.py:2: in (модуль) из pyexample.responses импортировать GeoJsonResponse .. \ pyexample \ response \ GeoJsonResponse.py: 12: in (модуль)

Класс GeoJsonResponse (Response): E TypeError: module () принимает не более 2 аргументов (дано 3)

ОШИБКА: не найдено: \ PyExample \ tests \ test_geojson.py :: TestGeoJson :: test_api_response

C:. \ Python37 \ Lib \ Зона-пакеты \ aenum__init __ пе: 163

(без имени 'PyExample \ tests \ test_geojson.py :: TestGeoJson :: test_api_response' ни в одном из [])

Ошибки делали все возможное, чтобы указать мне правильное направление, и ответ @Mickey Perlstein был мертв, мне потребовалась только минута, чтобы собрать все это вместе в моем собственном контексте:

Я импортировал модуль :

from pyexample.responses import Response

когда я должен был импортировать класс :

from pyexample.responses.Response import Response

Надеюсь, это кому-нибудь поможет. (В мою защиту, это все еще довольно рано.)


как это связано с вопросом?
Leevi L

3

Вы также можете сделать следующее в Python 3.6.1

from Object import Object as Parent

и ваше определение класса:

class Visitor(Parent):


0

В моем случае, когда у меня возникла проблема, я обращался к модулю, когда пытался расширить класс.

import logging
class UserdefinedLogging(logging):

Если вы посмотрите на документацию Info, вы увидите «logging», отображаемый как модуль.

В этом конкретном случае мне пришлось просто унаследовать модуль ведения журнала, чтобы создать дополнительный класс для ведения журнала.


Это можно квалифицировать как комментарий, а не как ответ. Пожалуйста, отвечайте, только если вы думаете, что это решит проблему.
Хамза Хуршид

Извини за это. Я новичок в активном использовании stackoverflow, и я не настолько знаком с сетевым этикетом сайта.
Джерардссон
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.