2012-12-08 5 views
3
while True: 
    print "\n--------" 
    room = getattr(self, next) 
    next = room() 

내 질문 Learn Python The Hard Way에서 발견 된 위의 코드 블록에서 유래한다. 나는 (...? 내가 거기 틀렸다하지 않는 한) 세 번째 줄은 room 변수로 (이 경우, self.next 단위) getattr() 기능의 결과를 저장하는 것을 이해: - <a href="http://learnpythonthehardway.org/book/ex43.html" rel="nofollow">Exercise 43</a> 운동 43 기능 만들기

지금 나를 매달려 네 번째 줄입니다 무엇, 함수 room()은 변수 next에 저장됩니다. 근본적으로, 나는 이것이 코드 블록에서 정의 된 함수가 아니기 때문에 room() 부분을 이해하지 못한다. 파이썬은 사용자가 앞의 변수를 기반으로 함수를 정의 할 수있게합니까? (예 : 처음으로 room()을 쓰면 변수 room에 저장된 내용을 기반으로 room()이라는 함수가 만들어집니다.

도움이 될 것입니다.

답변

5
room = getattr(self, next) 

는 호출되는 함수 을 반환.

next = room() 

함수는 파이썬에서 1 등급 객체이므로, 함수를 전달할 수 있습니다. 능숙한! 응답에 대한

>>> class foo: 
     def bar(self): 
     print 'baz!' 
     def __init__(self): 
     # Following lines do the same thing! 
     getattr(self, 'bar')() 
     self.bar() 
>>> foo() 
baz! 
baz! 
<__main__.foo instance at 0x02ADD8C8> 
+0

감사하고 지우기 :

는 다음과 같은 고려하십시오. 나는 gettr()이 함수를 반환하고 그것들을 저장할 수 있다는 것을 이해한다. 그러나 위의 코드에서 함수가 호출되지 않았습니까? 제가 물어 본 이유는 예제 43에서 코드화 된 스토리/게임의 다음 단계가 인쇄되기 때문입니다. 코드를 보면 프로그램이 play()에서 central_corridor()로 어떻게 이동합니까? 필자는 play()가 제공하는 대신 self.central_corridor()를 호출하여 코드를 통해 호출되는 함수를 보는데 익숙합니다.이 함수는 호출되는 것과는 반대로 저장되는 함수로 나타납니다. –

+0

위의 질문을 명확히하기 위해서 : next = room()은 room() 함수를 실행하고 결과를 다음 변수에 저장합니까? –

+0

네, 그런 일이 정확히 일어나고 있습니다. – Aesthete