Bienvenido a la Comunidad de Treehouse
¿Quieres colaborar en errores de código? ¿Tienes errores que necesitan comentarios? ¿Buscas un par de ojos adicionales en tu último proyecto? aquí.
¿Buscas aprender algo nuevo?
Treehouse ofrece una prueba gratuita de siete días para estudiantes nuevos. Obtén acceso a miles de horas de contenido y únete a miles de
Inicia tu prueba gratuita
Gary Lehman
2,387 puntos¿Cómo redefino un atributo de clase dentro de un método?
Estoy trabajando en una pregunta de desafío de código que es la siguiente:
Crea un método llamado eat. Solo debe tomar self como argumento. Dentro del método, establece el atributo is_hungry en False, ya que el Panda ya no tendrá hambre cuando coma. Además, devuelve una cadena que dice 'Bao Bao eats bamboo.' donde 'Bao Bao' es el atributo name y 'bamboo' es el atributo food.
Estoy seguro de que tengo la cadena de retorno formateada correctamente, pero no entiendo cómo definir name y food dentro de este método y clase para que los marcadores de posición en la cadena puedan hacer referencia a ellos con precisión.
También estoy confundido sobre por qué recibo el error de que el nombre "name" no está definido; si puedo redefinir el atributo "is_hungry" dentro de este método, ¿por qué no puedo usar la misma sintaxis para definir self.name = "Bao Bao" dentro de este método?
class Panda:
especie = 'Ailuropoda melanoleuca'
comida = 'bamboo'
def __init__(self, name, edad):
self.is_hungry = Verdadero
self.name = name
self.edad = edad
def eat(self):
self.is_hungry = False
self.name = Bao Bao
comida = bamboo
return f{name} eats {food}.
2 Respuestas
Asher Orr
Desarrollo en Python Graduado de Techdegree 9,411 Puntos¡Hola Jack!
Estoy seguro de que tengo la cadena de retorno formateada correctamente, pero no entiendo cómo definir name y food dentro de este método y clase para que los marcadores de posición en la cadena puedan hacer referencia a ellos con precisión.
¡Buena pregunta! Lo desglosaré así:
class Panda:
especie = 'Ailuropoda melanoleuca'
comida = 'bamboo'
#la línea anterior dice: para todas las instancias de la clase Panda, el atributo food es 'bamboo'
Ahora para el name:
class Panda:
especie = 'Ailuropoda melanoleuca'
comida = 'bamboo'
#la línea anterior dice: para todas las instancias de la clase Panda, el atributo food es 'bamboo'
def __init__(self, name, edad):
self.is_hungry = Verdadero
self.name = name
#la línea anterior establece el atributo "name" en cualquier instancia de tu clase Panda en lo que sea que lo configures.
self.edad = edad
def eat(self):
self.is_hungry = False
return f'{self.name} eats {self.food}.'
Cuando haces clic en "Check Work", el verificador de este desafío de Treehouse ejecuta código como este:
ashers_instance = Panda('Bao Bao', 7)
#esto crea la instancia de la clase.
#el método __init__ quiere argumentos para los atributos name y age, así que se agregan aquí.
ashers_instance.eat()
#ahora ejecuta el método 'eat' en esta instancia de tu clase Panda, a la que llamé ashers_instance
Ejecutar ashers_instance.eat() devolverá "Bao Bao eats bamboo."
'Bao Bao' es el nombre, ya que el verificador pasó el argumento 'Bao Bao' para el atributo name. El atributo name se establece cuando creas una instancia. Por eso el init método toma name como argumento.
Aunque puedes definir el atributo "is_hungry" dentro del método eat, el atributo name se establece cuando creas una instancia de la clase. Por eso no puedes definir self.name dentro de ese método - Python está buscando en el método dunder init el atributo name.
'Bamboo' es el atributo food, porque 'bamboo' es el atributo food para CUALQUIER instancia de la clase.
class Panda:
especie = 'Ailuropoda melanoleuca'
comida = 'bamboo'
Tu método eat está obteniendo información sobre sus atributos (self.name, self.age, self.species, etc) de 2 lugares:
A) Los atributos de la clase
class Panda:
especie = 'Ailuropoda melanoleuca'
comida = 'bamboo'
Si un atributo siempre debe ser igual, lo haces un atributo de clase.
B) El método dunder init.
def __init__(self, name, edad):
Estos son para atributos que podrían cambiar, dependiendo de la instancia. Por ejemplo:
bao_bao = Panda('Bao Bao', 7)
basi = Panda(Basi, 2)
bobo = Panda(Bobo, 5)
Espero que esto ayude. ¡Déjame saber si tienes más preguntas!
Steven Parker
244 163 puntosAunque "name" no está definido, "self.name" sí lo está. Asegúrate de incluir el prefijo "self." al crear los marcadores de posición en tu cadena de formato.
Además, el único atributo que debe cambiar con el nuevo método es "is_hungry". El name y food que se definieron cuando se creó la instancia deben reportarse, pero no deben cambiar. La información que se muestra en las instrucciones es solo a modo de ejemplo.