2011-11-01 2 views
0

메소드의 진입 점을 포함하는 테이블을 클래스 변수로 설치하는 방법은 어떻게됩니까?클래스 변수의 메소드 진입 점

는 설명 들어, 다음 -working- 코드를 살펴

class A(object): 

    def go(self, n): 
     method = self.table[n] 
     method(self) 

    def add(self): 
     print "add" 

    def multiply(self): 
     print "multiply" 

    table = { 
     1: add, 
     2: multiply, 
     } 

>>> q = A() 
>>> q.go(1) 
add 

는 그러나, 나는 많은 그것을 좋아하지 않아. 가독성을 위해 처음에는 테이블을 갖고 싶습니다. (실제 프로젝트는 훨씬 큽니다) method(self)을 사용하는 호출이 마음에 들지 않습니다. 나는 그것이 매우 혼란 스럽다고 생각한다.

제 질문은 : 더 좋은 방법이 있습니까? 아니면 위의 코드가 자리에 있습니까?

감사합니다.

답변

5

이미 포함되어 있습니다. __dict__이라고합니다.

class foo(object): 
    def go(self, method): 
     getattr(self, method)() 

    def a(self): 
     ... 

    def b(self): 
     ... 

숫자 인덱스를 원할 경우, 예를 들어 다음과 같이 할 수 있습니다.

class foo(object): 
    methods = { 1: 'a', 2: 'b' } 
    def go(self, n): 
     getattr(self, self.methods[n])() 

는하지만 그 문자열을 구금과 무명을 제외하고, 많이 구입하지 않고 그 대신에 마법의 정수를 사용하고, 특히 것을, 단지 바보입니다.

+0

numue는 필요하지 않습니다. ric 인덱스는 사실 문자열이지만, 파이썬에서 유효하지 않은 문자를 포함 할 수 있기 때문에 메소드 이름과 다른 키가 필요합니다. 여러 키가 동일한 메소드에 매핑 될 수 있습니다. 즉, 두 번째 스 니펫은보기에 좋았습니다. . 감사 – deStrangis

1

난 당신이 그렇게 할 이유가 얻을 모르겠지만, 당신은 다음과 같이 다르게 해결할 수 :

: 고양이 플러스 플러스 당신의 응답을 읽은 후

class A(object): 

    table = { 
     1: "add", 
     2: "multiply", 
     } 

    def go(self, n): 
     method = getattr(self, self.table[n]) 
     method() 

    def add(self): 
     print "add" 

    def multiply(self): 
     print "multiply" 

>>> a = A() 
>>> a.go(1) 
add 

편집 기존 메서드의 별칭을 원한다면 훨씬 쉬운 방법이 있습니다. 웨일스 어의 메서드를 호출 할 수 있기를 원할 수도 있습니다.

class A(object): 

    table = { 
     1: "add", 
     2: "multiply", 
     } 

    def go(self, n): 
     method = getattr(self, self.table[n]) 
     method() 

    def add(self): 
     print "add" 

    def multiply(self): 
     print "multiply" 

    ychwanegu = add 
    lluosi = multiply 

>>> a = A() 
>>> a.lluosi() 
multiply 
관련 문제