TypeError: module .__ 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 підтримує Моніку

Відповіді:


237

Ваша помилка трапляється тому Object, що це модуль, а не клас. Тож ваша спадщина - хитра.

Змініть заяву про імпорт на:

from Object import ClassName

і ваше визначення класу:

class Visitor(ClassName):

або

змінити визначення свого класу на:

class Visitor(Object.ClassName):
   etc

Чи буде це так само, якщо ClassNameповністю пропустити ? Як class Visitor()?
VMAtm

1
@VMAtm: Чому ви не пробуєте це і дізнаєтесь. Python є великим, тому що у нього є перекладач.
Шина

2
Геніальність. найгірша лінія помилок у світі. знадобилося мені 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 імпорту GeoJsonResponse .. \ pyexample \ responses \ GeoJsonResponse.py: 12: у (модульному) класі GeoJsonResponse (відповідь):

E TypeError: module () бере щонайбільше 2 аргументи (3 дані)

===================================== ПОМИЛКИ =============== =======================

___________________ ПОМИЛКА збирання тестів / test_geojson.py ____________________

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

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

ПОМИЛКА: не знайдено: \ PyExample \ testing \ test_geojson.py :: TestGeoJson :: test_api_response

C: \ Python37 \ lib \ site-пакети \ aenum__init __. Py: 163

(без імені "PyExample \ testing \ test_geojson.py :: TestGeoJson :: test_api_response" в будь-якому з [])

Помилки робили все можливе, щоб направити мене в правильному напрямку, і відповідь @Mickey Perlstein була мертва, мені знадобилося лише хвилину, щоб все це скласти у мій власний контекст:

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

from pyexample.responses import Response

коли я повинен був імпортувати клас :

from pyexample.responses.Response import Response

Сподіваюся, що це комусь допоможе. (На мій захист, ще досить рано.)


як це пов’язано з питанням?
Ліві Л

3

Ви також можете зробити наступне в Python 3.6.1

from Object import Object as Parent

і ваше визначення класу:

class Visitor(Parent):


0

У моєму випадку, коли у мене виникли проблеми, я мав на увазі модуль, коли намагався розширити клас.

import logging
class UserdefinedLogging(logging):

Якщо ви подивитесь на Інформацію про документацію, ви побачите "журнал", який відображається як модуль.

У цьому конкретному випадку мені довелося просто успадкувати модуль журналу, щоб створити додатковий клас для ведення журналу.


Це може кваліфікуватися як коментар, а не відповідь. Будь ласка, відповідайте лише, якщо ви думаєте, що це вирішить проблему.
Хамза Хуршид

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