2012-05-18 12 views
6

이 점에 대해 알고 이해해주세요. 나는 수업을 이해하려고하는 아주 간단한 프로그램을 만들었습니다.Python TypeError : 'str'객체를 호출 할 수 없습니다.

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

문제 CODE

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

왜 폴리 작동하지 클래스 인스턴스의 메소드를 호출합니까? 나는 꽤 길을 잃었다. 내가 http://mail.python.org/pipermail/tutor/2003-May/022128.html 및 기타 Stackoverflow 질문을 닮은 보였지만, 나는 그것을 얻지 않을거야. 정말 고맙습니다.

답변

3

클래스 Two의 인스턴스 메서드는 name()입니다. 그래서 Two.name이 방법을 말한다 다음과 같은 코드가 잘 작동 :

Polly = Two() 
Two.name(Polly) 

을하지만 __init__()에, 당신이 그렇게 언제 당신이 Two의 새로운 인스턴스를 생성, 문자열로 설정하여 name를 오버라이드 (override)의 name 속성은 참조 할 함수 대신 문자열에.

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

그냥 당신이 당신의 방법 및 인스턴스 변수에 대해 별도의 변수 이름을 사용하고 있는지 확인 : 다음과 같은 오류가 발생하는 이유입니다.

+0

이 명확한 설명을 주셔서 대단히 감사합니다. 나는 관련 질문이있다. 초기 이름을 설정하고 raw_input을 통해 이름을 설정하지 않으려면 어떻게해야합니까? 'self.name = name self.gender = gender'와'init __ (self, name, gender)'를 설정하고'Polly = Two (name, gender)'를 통해 호출하면 에러가 발생합니다. 여기서해야 할 일에 대해 불분명하다. – user1186742

+0

나는 그것을 얻었을지 모른다라고 생각해라. 나는 그 인스턴스 변수를 __init__보다는 메서드에 넣거나 그냥 빈 문자열로 설정한다. – user1186742

+1

클래스 내에서'raw_input' 작업을하지 마십시오; 별도의 책임. 사람들은 자신의 이름이 무엇인지 알아낼 책임이 없습니다. 그들의 이름은 출생, 어, 창조시 지정됩니다. –

3

name 속성을 name이라는 메서드로 덮어 쓰고 있습니다. 그냥 이름을 바꿉니다.

+0

알 수 있습니다. 고맙습니다! – user1186742

1

2에서 변수 의 "name"이라는 함수가 있습니다. 그들 중 하나의 이름을 다르게 지정하면 효과가 있습니다.

+0

전구의 순간. 고맙습니다! – user1186742

1

신중하게 이름을 지정하는 습관에 빠질 것을 강력히 제안합니다. 보시다시피, 아주 작은 코드라도 문제가 생길 수 있습니다. 파이썬 스타일의 PEP를 매우 조심스럽게 읽고 싶을 것이다. http://www.python.org/dev/peps/pep-0008/

+0

감사합니다. 나는 할 것이다! – user1186742

관련 문제