2017-09-09 1 views
1

Ich habe eine Klasse mit dem Namen Board, die als Oberklasse fungiert. Es ist im Grunde ein zufällig generiertes Sudoku-Board mit 81 Nummern, die korrekt durch die Regeln platziert werden."module .__ init __() benötigt höchstens 2 Argumente (3 gegeben)" beim Erstellen der Instanz einer Unterklasse

Dann habe ich eine Unterklasse mit dem Namen normalSudoku definiert, wo es mit einem Parameter "schwierigkeiten" (eine Zeichenkette) initialisiert wird, wo es entscheidet, wie viele leere Einträge auf dem Sudoku erscheinen.

Wenn ich eine Instanz von normalSudoku erstellt und versuchen, es zu drucken, um zu sehen, ob es funktioniert, erscheint die folgende Fehlermeldung aus:

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

Ich bin nicht sicher, was ich falsch gemacht habe und ich bin ein wenig verwirrt über die Verwendung von self und Objektinitialisierung in Python.

Meine Board Klasse:

class Board(object):  
    def __init__(self): 
     self.sudoku = self.__create__() 

    def __create__(self): 
     #generateion of board goes here 
     #it will return a 9x9 2d-list 

Meine normalSudoku Klasse:

import Board 
import random 

class normalSudoku(Board): 
    def __init__(self,difficulties): 
     Board.Board.__init__(self) 
     self.Create_Empty_Entries(self,difficulties) 

    def Create_Empty_Entries(self, difficulties): 
     numbers = list(range(0,9)) 
     if difficulties == "Easy": 
      for x in range(25): 
       a = random.choice(numbers) 
       b = random.choice(numbers) 
       self.sudoku[a][b] = None 
     elif difficulties == "Medium": 
      for x in range(35): 
       a = random.choice(numbers) 
       b = random.choice(numbers) 
       self.sudoku[a][b] = None 
     elif difficulties == "Hard": 
      for x in range(45): 
       a = random.choice(numbers) 
       b = random.choice(numbers) 
       self.sudoku[a][b] = None 
     elif difficulties == "Expert": 
      for x in range(65): 
       a = random.choice(numbers) 
       b = random.choice(numbers) 
       self.sudoku[a][b] = None 
     else: 
      print("The Level of Difficulty you chose does not exist.") 

Antwort

3

Sie versuchen, eine Unterklasse eines Modul, nicht Ihre Basisklasse zu erstellen.

Sie importieren das Modul hier:

import Board 

dann versuchen, das direkt zu Unterklasse:

class normalSudoku(Board): 

Board ist das Modul. Wenn die Klasse das gleiche benannt ist, es ist ein Attribut auf dem Modul:

class normalSudoku(Board.Board): 
    def __init__(self,difficulties): 
     Board.Board.__init__(self) 

Sie hatten bereits den __init__ Anruf Anruf richtig, nur nicht die Basisklasse Referenz.

Alternativ importieren Sie die Klasse aus dem Modul:

from Board import Board 

und Ihre class Definition die gleiche verlassen, aber die __init__ Anruf einstellen:

class normalSudoku(Board): 
    def __init__(self,difficulties): 
     Board.__init__(self) 

Einige andere Hinweise:

  • Nicht verwenden __name__ dunder (d Doppelter Unterstrich). Diese sind reserved by Python for future system use und können daher zu Problemen mit der Abwärtskompatibilität führen.

  • Versuchen Sie, die Python PEP 8 naming conventions zu folgen; es wird zu mehr Klarheit führen. Die Namen der Module lauten in der Regel lower_case_with_underscores, Klassen verwenden CamelCase. Ihr Modul sollte board heißen, die Klasse Board, was den Unterschied offensichtlich macht. Das gleiche gilt für Methoden; diese sollten auch Kleinbuchstaben sein.

+0

Vielen Dank, dass meine Fehler für den Hinweis auf! Ihre Antwort ist sehr hilfreich. Ich habe jetzt alle Fehler behoben und hatte ein besseres Verständnis der Klassenstruktur in Python. :) –

0

In addtition zu Martjin Pieters' answer, Ihre Linie self.Create_Empty_Entries(self,difficulties) auch falsch ist, sollte es self.Create_Empty_Entries(difficulties) sein.

Bedenken Sie:

>>> class Foo(object): 
    def foo(self): 
     return self 


>>> print Foo 
<class '__main__.Foo'> 
>>> instance = Foo() 
>>> print instance 
<__main__.Foo object at 0x02FFF7F0> 
>>> print instance.foo() #as you can see, I don't pass any argument here 
<__main__.Foo object at 0x02FFF7F0> #however you can note that internally, "instance" passed itself as "foo()" first argument 
+0

Ja, das könnte ich auch sagen, wenn eine Klasse ihre Memberfunktion aufruft, übergibt sie sich automatisch als erstes Argument richtig? –

+0

Ja, aber nicht ganz: Sie haben es, aber seien Sie sicher, dass Sie den Unterschied zwischen der Klasse und ihrer Instanz machen. Es gibt Feinheiten. Ihre Bezeichnung ist korrekt, wenn die aufgerufene Methode eine "Klassenmethode" ist (definiert mit dem Dekorator '@ classmethod'. Für das, was Sie meinen, sollten Sie sagen: Wenn eine Instanz ihre Elementmethode aufruft, übergibt sie sich automatisch als erste Streit –

Verwandte Themen