2014-04-23 2 views
0

다른 클래스 메소드를 가리키는 함수 포인터 사전을 갖고 싶습니다. 그것을하는 가장 좋은 방법은 무엇입니까?파이썬 클래스와 메소드에 대한 포인터

class A(): 
    command_map = { 
     "call func1 of object1": ("1", func1) 
     "call func1 of object2": ("2", func1) 
    } 
    def __init__(self, object1, object2): 
     self.O1 = object1 
     self.O2 = object2 
    def call(self, cmd): 
     t = self.command_map[cmd] 
     target = t[0] 
     func = t[1] 
     if target == "1": 
      resp = self.O1.func() 
     elif target == "2": 
      resp = self.O2.func() 
     else: 
      self._logger.warn("Unknown target %r\n" % target) 

이 경우, eclipse는 func 변수가 사용되지 않는다고 강조 표시합니다. 그럼 어떻게 하시겠습니까? objectb의 funca() 또는 funcb()를 일부 입력 값에 따라 호출하려고합니다.

"command-map"에 self.O1을 넣을 수있는 방법이 있습니까?

+0

'func'이란 무엇입니까? –

+0

당신이'getattr'을 찾고 있다고 생각하지만, 당신이하려고하는 것을 완전히 이해하지 못합니다. –

답변

0

command_map에 실제 '포인터'대신 함수 이름을 포함하도록 변경하십시오.

command_map = { 
    'call func1 of object1': ('1', 'func1'), 
    'call func1 of object2': ('2', 'func1'), 
} 

그런 다음이처럼 call 방법을 정의 할 수 있습니다

def call(self, cmd): 
    t = A.command_map[cmd] # command_map is a class attribute, not an instance attribute 
    if t[0] == '1': 
     o = self.O1 
    elif: 
     o = self.O2 
    else: 
     self._logger.warn("Unknown target %r\n" % target) 
     return 

    f = getattr(o, t[1]) # get the method 
    f() 
0

당신은 메소드 이름을 참조하지 저장해야합니다. 그런 다음 지정된 객체에서 getattr으로 검색 할 수 있습니다.

class A(): 
    command_map = { 
     "call func1 of object1": ("O1", 'func1_name') 
     "call func1 of object2": ("O2", 'func1_name') 
    } 

    def __init__(self, object1, object2): 
     self.O1 = object1 
     self.O2 = object2 

    def call(self, cmd): 
     target_name, method_name = self.command_map[cmd] 

     target_object = getattr(self, target_name, None) 
     if target_object is not None: 
      method = getattr(target_object, method_name, None) 
      if method is not None and callable(method): 
       return method() 
     else: 
      self._logger.warn("Unknown target %r\n" % target) 
+0

귀하의 제안으로 제 문제가 해결되었습니다. – user1439521

+0

기쁩니다. 이 경우 답변을 승인 해주십시오. 고마워. –

관련 문제