TypeError: module .__ init __ () en fazla 2 argüman alır (3 verilen)


154

Adlı bir dosyada bir sınıf tanımladım Object.py. Bu sınıftan başka bir dosyada miras almaya çalıştığımda, yapıcıyı çağırmak bir istisna atıyor:

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

Bu benim kodum:

import Object

class Visitor(Object):
    pass

instance = Visitor()  # this line throws the exception

Neyi yanlış yapıyorum?


2
Lütfen verilen cevabı seçer misiniz? Doğru görünüyor ve diğer soruların sizin çiftleriniz olarak kapatılmasına izin verecek.
Mad Physicist

1
Hey @wakamdr yinelenen soru işlevselliği oldukça kullanışlı. Cevabımın doğru olmamasının bir nedeni var mı?
Sheena

Diğer soruların bunun kopyası olarak tekrar kapatılması için bir cevabın kabul edilmesine gerek yoktur.
user2357112, Monica'yı

Yanıtlar:


244

Hatanız Objectbir modül olduğu için oluyor , bir sınıf değil. Yani mirasın berbat.

İthalat ifadenizi şu şekilde değiştirin:

from Object import ClassName

ve sınıf tanımınız:

class Visitor(ClassName):

veya

sınıf tanımınızı şu şekilde değiştirin:

class Visitor(Object.ClassName):
   etc

ClassNameTamamen ihmal edilirse, aynı şekilde mi çalışacak ? Beğen class Visitor()?
VMAtm

1
@VMAtm: Neden denemiyorsun ve öğrenmiyorsun. Python harika çünkü tercümanı var. Hızlı deneyler için harika
Sheena

2
Dahi. dünyadaki en kötü hata hattı. Sınıfı değil modülü kullandığımı anlamam 3 saatimi aldı. # $% ^ $% & $% &
Mickey Perlstein

Bunu Java kullanıcıları için daha açık hale getirmek için, dosya Object ve sınıf ClassName'dir. Python'da bir dosya bir modüldür ve dosyanın içindeki sınıf tanımları sınıflardır.
Kelly Bang

7

@Mickey Perlstein'ın cevabından ve 3 saatlik dedektiflik çalışmasından sonra bile, bunu kendi karmaşama uygulamak birkaç dakikamı daha aldı. Başka birinin benim gibi olması ve biraz daha yardıma ihtiyacı olması durumunda, işte benim durumumda olanlar.

  • yanıtlar bir modüldür
  • Yanıt, yanıtlar modülündeki temel bir sınıftır
  • GeoJsonResponse, Response'tan türetilen yeni bir sınıftır.

İlk GeoJsonResponse sınıfı:

from pyexample.responses import Response

class GeoJsonResponse(Response):

    def __init__(self, geo_json_data):

İyi görünüyor. Bir şeyde hata ayıklamaya çalışıncaya kadar sorun yok, ki bu, bunun gibi görünüşte belirsiz bir dizi hata mesajı aldığınız zaman:

pyexample.responses'dan GeoJsonResponse'yi içe aktarın .. \ pyexample \ responses \ GeoJsonResponse.py: 12: (modül) sınıfında GeoJsonResponse (Yanıt):

E TypeError: module () en fazla 2 argüman alır (verilen 3)

================================= HATALAR ============== ======================

___________________ test toplama hatası / test_geojson.py ____________________

test_geojson.py:2: pyexample.responses'tan (modül) içinde GeoJsonResponse .. \ pyexample \ responses \ GeoJsonResponse.py: 12: in (modül)

sınıf GeoJsonResponse (Yanıt): E TypeError: module () en fazla 2 argüman alır (3 verilen)

HATA: bulunamadı: \ PyExample \ testler \ test_geojson.py :: TestGeoJson :: test_api_response

C: \ Python37 \ lib \ site paketleri \ aenum__init __. Py: 163

([] öğelerinin hiçbirinde 'PyExample \ testing \ test_geojson.py :: TestGeoJson :: test_api_response' adı yok)

Hatalar beni doğru yöne yönlendirmek için ellerinden gelenin en iyisini yapıyordu ve @Mickey Perlstein'ın cevabı kesin değildi, hepsini kendi bağlamıma göre bir araya getirmek sadece bir dakikamı aldı:

Modülü içe aktarıyordum :

from pyexample.responses import Response

sınıfı içe aktarmam gerektiğinde :

from pyexample.responses.Response import Response

Umarım bu birine yardımcı olur. (Savunmamda, hala oldukça erken.)


bunun soruyla nasıl bir ilişkisi var?
Leevi L

3

Python 3.6.1'de aşağıdakileri de yapabilirsiniz.

from Object import Object as Parent

ve sınıf tanımınız:

class Visitor(Parent):

2
from Object import Object

veya

From Class_Name import Class_name

Nesne bir .pydosyaysa.


0

Benim durumumda sorun yaşadığımda, sınıfı genişletmeyi denediğimde bir modülden bahsediyordum.

import logging
class UserdefinedLogging(logging):

Dokümantasyon Bilgisine bakarsanız, modül olarak "günlüğe kaydetme" nin görüntülendiğini görürsünüz.

Bu özel durumda, günlük kaydı için fazladan bir sınıf oluşturmak için yalnızca günlükleme modülünü devralmam gerekiyordu.


Bu bir yanıt olarak değil, bir yorum olarak nitelendirilebilir. Lütfen yalnızca sorunu çözeceğini düşünüyorsanız cevap verin.
Hamza Hurşid

Bunun için üzgünüm. Stackoverflow'u aktif olarak kullanma konusunda yeniyim ve sitenin ağına o kadar aşina değilim.
Gerardsson
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.