Ошибка типа: модуль .__ 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.