es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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

Tags:  , , , ,

Answer

  1. Avatar for 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. Como genLegalBoard es un método de instancia de la clase QueenSolver, 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:

    solver = QueenSolver()
    

    Luego, puedes llamar al método genLegalBoard en la instancia de esta manera:

    board = solver.genLegalBoard([0, 0], [7, 7], 8)
    

    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ámetro cls se pasará automáticamente en lugar de self.

    class QueenSolver:
    
        @classmethod
        def genLegalBoard(cls, q1, q2, n):
            # ...
    

    Entonces, puedes llamar al método de esta manera:

    board = QueenSolver.genLegalBoard([0, 0], [7, 7], 8)
    

    Espero que esto ayude. Hágamelo saber si tiene alguna otra pregunta.

Comments are closed.