Recientemente me puse a aprender el lenguaje Python usando Python 3.7. Estoy usando la base de un rpg de texto para aprender las cuerdas de Python, ya que es algo que me interesa. Designe la clase y la configuré para imprimir la clase 'Estadísticas' para que pueda cambiar los valores. más tarde con la entrada del usuario. La consola está imprimiendo las estadísticas como quiero, pero con un 'Ninguno' agregado después de los números. ¿Alguien puede explicar por qué sucede esto y cómo debo solucionarlo? Si solo va a publicar código sin una explicación, por favor no ... Estoy tratando de aprender, después de todo :)

class Stats:

    def __init__(self, strength=0, dexterity=0, wisdom=0, intelligence=0):
        self.strength = strength
        self.dexterity = dexterity
        self.wisdom = wisdom
        self.intelligence = intelligence

    def getStats(self):
        print(self.strength, self.dexterity, self.wisdom, self.intelligence)

    def statinput(self, value1, value2, value3, value4):
        self.value1 = strength_input
        self.value2 = dexterity_input
        self.value3 = wisdom_input
        self.value4 = intelligence_input
        if strength_input:
            self.strength = self.strength + value1
        if dexterity_input:
            self.dexterity = self.dexterity + value2
        if wisdom_input:
            self.wisdom = self.wisdom + value3
        if intelligence_input:
            self.intelligence = self.intelligence + value4

player = Stats(1, 1, 1, 1)
print(player.getStats())

strength_input = int(input('Enter a value for strength.'))
dexterity_input = int(input('Enter a value for dexterity.'))
wisdom_input = int(input('Enter a value for wisdom.'))
intelligence_input = int(input('Enter a value for intelligence.'))

player_stat_choice = player.statinput(strength_input, dexterity_input,
                            wisdom_input, intelligence_input,)

print(player.getStats())

Todo el código anterior funciona, pero está imprimiendo lo siguiente en la consola:

1 1 1 1
None
Enter a value for strength.2
Enter a value for dexterity.2
Enter a value for wisdom.2
Enter a value for intelligence.2
3 3 3 3
None

No estoy seguro de si la parte 'Ninguno' va a afectar algo más adelante en el camino después de que haya expandido este bit, así que me gustaría manejarlo ahora :) Gracias de antemano por su tiempo.

2
kexana 30 sep. 2019 a las 19:07

5 respuestas

La mejor respuesta
def getStats(self):
    print(self.strength, self.dexterity, self.wisdom, self.intelligence)

Es una mala idea usar print () para imprimir valores de clase en un método de clase. Hay dos formas mejores: 1)

def get_stats(self):
    return f"{self.strength}, {self.dexterity}, {self.wisdom}, {self.intelligence}"

Luego puedes imprimir estadísticas de jugador como esta:

print(player.get_stats())

Pero eche un vistazo a estilo de código Python PEP8. y nombra tus funciones y métodos correctamente.

2)

def __str__(self):
    return f"{self.strength}, {self.dexterity}, {self.wisdom}, {self.intelligence}"

Reemplace su método obsoleto getStats () y use el método dunder str () Entonces puedes imprimir fácilmente las estadísticas del jugador como esta

print(player)
1
komeil majidi 30 sep. 2019 a las 16:15

print(player.getStats()) está imprimiendo lo que devuelve el método getStats, que es un valor None ya que no hay una declaración de devolución (None siempre se devuelve por defecto).

La impresión de las estadísticas se realiza dentro del método, y puede considerarse como un "efecto secundario" de llamar al método getStats.

Usted debería:

Modifique el método para que devuelva esos valores:

def getStats(self):        
    return self.strength, self.dexterity, self.wisdom, self.intelligence

# later down the code...
print(*player.getStats())

Simplemente llame al método getStats, si desea dejar dentro la declaración de impresión:

def getStats(self):        
    print(self.strength, self.dexterity, self.wisdom, self.intelligence)

# later down the code...
player.getStats()

Elegiría la primera opción; de lo contrario, tiene un método llamado obtener estadísticas que en realidad no obtiene las estadísticas , solo las imprime.

0
jfaccioni 30 sep. 2019 a las 16:15

Esto se debe a que Stats.getStats imprime los valores y no los devuelve. Si no hay retorno en una función, devuelve implícitamente None, por lo que los está imprimiendo y luego devuelve None.

Deberías llamar a getStats

player.getStats()
#instead of print(player.getStats())

O devuelva las estadísticas en lugar de imprimirlas:

def getStats(self):
    return self.strength, self.dexterity, self.wisdom, self.intelligence

Entonces llámalo así:

print(*player.getStats())
1
Jab 30 sep. 2019 a las 16:15

¿Por qué getStats imprime las estadísticas en lugar de devolverlas? Ese método no devuelve nada, por lo que implícitamente devuelve None, que es exactamente lo que imprime print(player.getStats())

Sería mejor cambiar la definición de su clase a:

def getStats(self):
        return (self.strength, self.dexterity, self.wisdom, self.intelligence)
4
John Coleman 30 sep. 2019 a las 16:14

player.getStats() imprime esos valores y devuelve Ninguno . Si lo llama print(player.getStats()), el método getStats imprime valores, y eso imprime el valor de retorno (Ninguno). Creo que querías player.getStets() en lugar de print(player.getStats()).

1
galaxy001 30 sep. 2019 a las 16:15
58171542