Cómo implementar correctamente funciones auxiliares en una clase en Python.
Soy bastante nuevo en Python y estoy tratando de diseñar una clase para resolver el problema de las N Reinas.
Esta es mi definición de clase:
class QueenSolver:
def genEmptyBoard(self, n):
# Genera un tablero vacío de ancho n y alto n
board = []
for _ in range(n):
board.append([0 for _ in range(n)])
return board
def genLegalBoard(self, q1, q2, n):
# Devuelve un tablero válido o False
board = self.genEmptyBoard(self, n)
try:
board[q1[0]][q1[1]] = 'q'
except IndexError:
print("Reina colocada fuera de los límites del tablero")
return False
try:
if board[q2[0]][q2[1]] == 'q':
print("Las reinas no pueden colocarse en la misma posición")
return False
board[q2[0]][q2[1]] = 'Q'
except IndexError:
print("Reina colocada fuera de los límites del tablero")
return False
return board
Sin embargo, cuando llamo a este método fuera de la definición de la clase, como esto:
board = QueenSolver.genLegalBoard([0, 0], [7, 7], 8)
Obtengo un error que se ve así:
Ha ocurrido una excepción: TypeError
Se requiere un argumento posicional requerido: 'n'
Aparentemente tengo que suministrar la variable ‘self’ al llamarlo desde fuera de la definición de la clase. ¿Pensé que el parámetro ‘self’ no requería ningún valor, porque se asume? ¿Qué me estoy perdiendo aquí?
davy.ai
El problema con el código está en la forma en que se llama al método
genLegalBoard
fuera de la definición de la clase. ComogenLegalBoard
es un método de instancia de la claseQueenSolver
, debe ser llamado en una instancia de la clase en lugar de directamente en la clase misma.Para crear una instancia de la clase
QueenSolver
, simplemente puedes llamar a su constructor de esta manera:Luego, puedes llamar al método
genLegalBoard
en la instancia de esta manera:De esta manera, el parámetro
self
se pasa automáticamente por Python cuando se llama al método en la instancia.Alternativamente, puedes hacer que
genLegalBoard
sea un método de clase añadiendo el decorador@classmethod
encima de la definición del método. De esta manera, el método puede ser llamado directamente en la clase y el parámetrocls
se pasará automáticamente en lugar deself
.Entonces, puedes llamar al método de esta manera:
Espero que esto ayude. Hágamelo saber si tiene alguna otra pregunta.