简体   繁体   中英

Python TypeError: 'str' object is not callable for class

Please help me understand this. I created a really simple program to try to understand classes.

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()

THE PROBLEM CODE

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

Why does calling the method on the class instance Polly not work? I'm pretty lost. I've looked at http://mail.python.org/pipermail/tutor/2003-May/022128.html and other Stackoverflow questions similiar to this, but I'm not getting it. Thank you so much.

You are overwriting your name attribute with method called name . Just rename something.

The class Two has an instance method name() . So Two.name refers to this method and the following code works fine:

Polly = Two()
Two.name(Polly)

However in __init__() , you override name by setting it to a string, so any time you create a new instance of Two , the name attribute will refer to the string instead of the function. This is why the following fails:

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

Just make sure you are using separate variable names for your methods and your instance variables.

You have both a variable and a function called "name" in Two. Name one of them differently and it should work.

I would strongly suggest you get into the habit of carefully naming things. As you can see, even with very small pieces of code, you can get into trouble. You'll definitely want to read the Python style PEP very carefully. http://www.python.org/dev/peps/pep-0008/

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM