2017-09-09 1 views
1

J'ai une classe nommée Board qui agit comme une superclasse. Il s'agit essentiellement d'un tableau de Sudoku généré aléatoirement avec 81 numéros placés correctement par les règles."module .__ init __() prend au plus 2 arguments (3 donnés)" lors de la création de l'instance d'une sous-classe

Puis j'ai défini une sous-classe nommée normalSudoku où elle sera initialisée avec un paramètre "difficulty" (une chaîne) où elle décidera combien d'entrées vides apparaîtront sur le Sudoku.

Lorsque je créé une instance de normalSudoku et d'essayer de l'imprimer pour voir si cela fonctionne, l'erreur suivante apparaît sur:

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

Je ne sais pas ce que je fait de mal et je suis un peu confus sur l'utilisation de self et l'initialisation d'objet en python.

Mon Board Classe:

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 

Mon normalSudoku Classe:

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.") 

Répondre

3

Vous essayez de créer une sous-classe d'un module , pas votre classe de base.

Vous importez le module ici:

import Board 

puis essayez de sous-classe directement:

class normalSudoku(Board): 

Board est le module. Si la classe porte le même nom, il est un attribut du module:

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

Vous avez déjà eu le bon appel d'appel __init__, mais pas la référence de classe de base.

Vous pouvez également importer la classe à partir du module:

from Board import Board 

et laissez votre définition class le même, mais régler l'appel __init__:

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

Quelques autres pointeurs:

  • N'utilisez pas __name__ dunder (d ouble underscore) noms. Ce sont reserved by Python for future system use, et peuvent ainsi conduire à des problèmes de compatibilité.

  • Essayez de suivre le Python PEP 8 naming conventions; cela mènera à plus de clarté. Les modules sont généralement nommés en utilisant lower_case_with_underscores noms, les classes utilisent CamelCase. Votre module devrait être nommé board, la classe Board, ce qui rend la différence évidente. La même chose vaut pour les méthodes; ceux-ci devraient être en minuscules aussi.

+0

Merci beaucoup pour souligner mes erreurs! Votre réponse est vraiment utile. J'ai corrigé toutes les erreurs maintenant et j'ai mieux compris la structure des classes en python. :) –

0

En addtition à Martjin Pieters' answer, votre ligne self.Create_Empty_Entries(self,difficulties) est également incorrecte, il devrait être self.Create_Empty_Entries(difficulties).

Considérez ceci:

>>> 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

ouais ça aussi, je pourrais dire que quand une classe appelle sa fonction membre, elle se passe automatiquement comme son premier argument à droite? –

+0

Yup, mais pas tout à fait: vous l'avez, mais assurez-vous de faire la différence entre la classe et son instance. Il y a des subtilités. Votre sature est correct si la méthode appelée est un "classmethod" (défini avec le décorateur '@ classmethod'.) Pour ce que vous voulez dire, vous devriez dire: Lorsqu'une instance appelle sa méthode membre, elle se passe automatiquement comme sa première argument –