2010-02-26 3 views
5

모두. 아래 예를 참조하십시오. 'schedule_action'메서드에 문자열을 제공하여 어떤 Bot 클래스 메서드를 호출해야하는지 지정하고 싶습니다. 아래의 예제에서 'bot.action()'으로 표현했지만 제대로 수행하는 방법을 모릅니다.Python 스크립트가 실행 중입니다. 메서드 이름이 문자열입니다. 이 메서드는 어떻게 호출합니까?

getattr(bot, action)() 

getattr은 이름으로 객체에 속성을 볼 것이다 한마디로

class Bot: 
    def work(self): pass 
    def fight(self): pass 

class Scheduler: 
    def schedule_action(self,action): 
     bot = Bot() 
     bot.action() 

scheduler = Scheduler() 
scheduler.schedule_action('fight') 

답변

13

getattr :

class Bot: 
    def fight(self): 
     print "fighting is fun!" 

class Scheduler:  
    def schedule_action(self,action): 
     bot = Bot() 
     getattr(bot,action)() 

scheduler = Scheduler() 
scheduler.schedule_action('fight') 

getattr도 요청 된 동작이없는 경우 기본값을 반환 할 수있는 선택적 인수를 사용합니다. 그것은 당신의 상황에 적용되는 경우

7

를 도와주세요 - 속성이 데이터 나 끝에 추가 () 멤버 메소드 메소드를 호출 할 수 있습니다.

당신은뿐만 아니라, 다음과 같이 별도의 단계에서 방법을 얻을 수

:

method_to_call = getattr(bot, action) 
method_to_call() 

을 그리고 당신은 일반적인 방법으로 메소드에 인수를 전달할 수 있습니다

getattr(bot, action)(argument1, argument2) 

또는

method_to_call = getattr(bot, action) 
method_to_call(argument1, argument2) 
3
class Scheduler: 
    def schedule_action(self,action): 
     bot = Bot() 
     boundmethod = getattr(bot, action) 
     boundmethod() 
1
def schedule_action(self,action): 
     bot = Bot() 
     bot.__getattribute__(action)() 
6

는 잘 모르겠어요,하지만 당신은 문자열을 함수 포인터를 사용하는 대신에 조작 고려할 수 있습니다.

class Bot: 
    def work(self): 
     print 'working' 
    def fight(self): 
     print 'fightin' 

class Scheduler: 
    def schedule_action(self,action): 
     bot = Bot() 
     action(bot) 

scheduler = Scheduler() 
scheduler.schedule_action(Bot.fight) 
scheduler.schedule_action(Bot.work) 

인쇄 어느 : 만약 당신이 할 수있는

fightin 
working 

, 그것은 컴파일시에서 맞춤법이 틀린 기능 에 대해 당신에게 오류를 줄 것이다 코드가 실행 시간 동안 대신 해석 할 때 . 이렇게하면 어리석은 데이터 입력 오류에 대한 디버그주기가 단축 될 수 있습니다. 특히 작업이 일정 기간 동안 수행되는 경우 더욱 그렇습니다. 하룻밤 사이에 뭔가를 실행하고 아침에 구문 오류가 있음을 발견하는 것보다 더 짜증나는 일은 없습니다.

+0

이 옵션을 강력히 고려하십시오. 호출 할 메소드를 동적으로 선택하려면이 옵션이 적합 할 수 있습니다. 파일, 소켓 또는 사용자 입력에서 파일을 읽는 것과 같이 회귀 방식으로 이름을 생성하는 경우에만 getattr 기반 옵션을 사용하십시오. – Wesley

+1

설명 된 상황에서 오류가 더 빨리 발생하지만 컴파일 타임에 오류가 발생하지 않는 것은 사실입니다. –

+0

아, 맞아. 수정 된 게시물. –

1

사전을 사용하여 메서드를 작업에 매핑 할 수도 있습니다. 예 :

관련 문제