2012-05-18 28 views
6

Por favor, ayúdame a entender esto. Creé un programa realmente simple para tratar de entender las clases.Python TypeError: el objeto 'str' no se puede llamar para la clase

class One(object): 
    def __init__(self, class2): 
     self.name = 'Amy' 
     self.age = 21 
     self.class2 = class2 

    def greeting(self): 
     self.name = raw_input("What is your name?: ") 
     print 'hi %s' % self.name 

    def birthday(self): 
     self.age = int(raw_input("What is your age?: ")) 
     print self.age 

    def buy(self): 
     print 'You buy ', self.class2.name 

class Two(object): 
    def __init__(self): 
     self.name = 'Polly' 
     self.gender = 'female' 

    def name(self): 
     self.gender = raw_input("Is she male or female? ") 
     if self.gender == 'male'.lower(): 
      self.gender = 'male' 
     else: 
      self.gender = 'female' 

     self.name = raw_input("What do you want to name her? ") 

     print "Her gender is %s and her name is %s" % (self.gender, self.name) 

Polly = Two() 
Amy = One(Polly) 
# I want it to print 


Amy.greeting() 
Amy.buy() 
Amy.birthday() 

el código de problema

Polly.name() # TypeError: 'str' object is not callable 
Two.name(Polly)# Works. Why? 

¿Por qué se llama al método en la instancia de la clase Polly no funciona? Estoy bastante perdido. He visto http://mail.python.org/pipermail/tutor/2003-May/022128.html y otras preguntas sobre Stackoverflow similares a esto, pero no lo estoy obteniendo. Muchas gracias.

Respuesta

3

La clase Two tiene un método de instancia name(). Así Two.name se refiere a este método y el siguiente código funciona bien:

Polly = Two() 
Two.name(Polly) 

Sin embargo, en __init__(), se reemplaza name estableciéndola en una cadena, por lo que cualquier vez que se crea una nueva instancia de Two, el atributo name se referirá a la cadena en lugar de la función. Esta es la razón por la siguiente falla:

Polly = Two()  # Polly.name is now the string 'Polly' 
Polly.name()  # this is equivalent to 'Polly'() 

Sólo asegúrese de que está utilizando nombres de variables independientes para sus métodos y sus variables de instancia.

+0

Muchas gracias por esta explicación clara. Tengo una pregunta relacionada. ¿Qué sucede si no deseo establecer un nombre inicial y simplemente configurar el nombre a través de raw_input? Obtengo errores si configuro 'self.name = name self.gender = gender' y' init __ (self, name, gender) 'y luego lo llamo mediante' Polly = Two (name, gender) ', entonces estoy no está claro qué hacer aquí. – user1186742

+0

Creo que puede haberlo conseguido. Acabo de poner esas variables de instancia en los métodos en lugar de __init__, o simplemente configurarlas en cadenas vacías. – user1186742

+1

No hagas el trabajo 'raw_input' dentro de la clase; responsabilidades separadas. Las personas no son responsables de descifrar cuáles son sus nombres; sus nombres se asignan al nacer, er, creación. –

3

Está sobrescribiendo su atributo name con el método denominado name. Solo cambia el nombre de algo.

+0

Lo tengo. ¡Gracias! – user1186742

1

Tiene una variable y una función llamada "nombre" en Dos. Nombra uno de ellos de manera diferente y debería funcionar.

+0

Momento de la bombilla. ¡Gracias! – user1186742

1

Le sugiero encarecidamente que adquiera el hábito de nombrar cuidadosamente las cosas. Como puede ver, incluso con pequeños fragmentos de código, puede meterse en problemas. Definitivamente querrá leer la PEP de estilo Python con mucho cuidado. http://www.python.org/dev/peps/pep-0008/

+0

Gracias. ¡Voy a! – user1186742

Cuestiones relacionadas