2014-04-03 3 views
3

클래스 내에서 실행 가능 함수 사전을 생성하려고합니다. 그러나 자기 매개 변수가 제대로 작동하는 데 문제가 있습니다.클래스 내 함수 사전으로 self 매개 변수

class myclass(object): 

    def x(self): 
    return 'x' 

    def y(self): 
    return 'y' 

    EF= { 
    'a':x, 
    'b':y, 
    } 

    def test(self): 
    print self.EF['a']() 

내가 클래스의 '테스트'기능을 실행하려고 할 때이 평가하고있는 기능 중 하나를 실행, 나는이 매개 변수의 수 주위에 오류가 발생합니다 :

다음 코드를 고려 사전.

>>> class myclass(object): 
... def x(self): 
... return 'x' 
... def y(self): 
... return 'y' 
... EF= { 
... 'a':x, 
... 'b':y, 
... } 
... def test(self): 
...  print self.EF['a']() 
... 
>>> 
>>> 
>>> m=myclass() 
>>> m.test() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 11, in test 
TypeError: x() takes exactly 1 argument (0 given) 

몇 가지 변형을 시도해 보았습니다. 내가 명시 적으로 다음과 같이 매개 변수로 자기를 통과 할 때

EF= { 
    'a':self.x, 
    'b':self.y, 
    } 

작업을했던 유일한

이었다.

... def test(self): 
...  print self.EF['a'](self) 
... 
>>> m=myclass() 
>>> m.test() 
x 

사전을 색인 함수로 사용하는 것에 대해서는 다른 질문이 있지만 클래스에는 없습니다.

여기 내 질문은 :

  • 자기 매개 변수를 처리 할 수있는 적절한 방법은 무엇입니까?
  • 사전 상수를 상수 섹션으로 옮기는 것을 선호합니다. 그렇게 할 수 있습니까? 그렇다면 어떻게 할 수 있습니까? 나는 그것을해야합니까?
  • 수업 중에 내 사전을 가져야 만한다면 왜 수업의 맨 위로 옮길 수 없습니까?

그게 전부입니다. 도와 주셔서 감사합니다.

답변

3

self 매개 변수를 처리하는 적절한 방법은 무엇입니까? (암시 적보다 더 명시 적으로!)

파이썬은 this 식별자를 사용하여 다른 명령형 언어와 유사한 방식으로 self 식별자를 사용하지만 명시 적입니다

이 당신은 어느 쪽인가로 클래스를 사용할 수 있습니다 인스턴스화 된 객체 또는 정적 클래스 자체. 인스턴스화 된 버전에 대한

, 당신은 아마 내 상수 섹션으로 클래스의 내 사전 일정한 외부로 이동하는 것을 선호

>>> class myclass: 
    def __init__(self): 
     self.EF = {'a':self.x,'b':self.y} 
    def x(self): 
     return 'x' 
    def y(self): 
     return 'y' 
    def test(self): 
     print self.EF['a']() 


>>> my_test_class = myclass() 
>>> my_test_class.test() 
x 

위한 것 찾고 있습니다. 그렇게 할 수 있습니까? 그렇다면 어떻게 할 수 있습니까? 나는 그것을해야합니까? 당신이 당신의 클래스 정의 외부 딕셔너리 그들에게 정적 방법을 사용하고 싶다면 내가/내 내 사전을 가지고해야하는 경우

, 당신은 @staticmethod 장식

>>> class myclass(object): 
    @staticmethod 
    def x(): 
     return 'x' 
    @staticmethod 
    def y(): 
     return 'y' 


>>> EF = {'a':myclass.x,'b':myclass.y} 
>>> EF['a']() 
'x' 

을 사용해야합니다 내 수업, 왜 그것을 수업의 맨 위로 옮길 수 없습니까?

모든 객체 속성이 __init__ 함수 중 하나를 정의 또는 명시 적으로 그들을 설정해야합니다.

+0

좋아 보이지만 나는 투표에서 벗어났습니다 ... 다시. –

+0

좋습니다. 좋은 설명뿐. 감사. 클래스 내의 클래스에서만 사용되는 상수를 선언하거나 __init__ 함수에서 상수를 선언하는 것이 좋습니다. –

+0

@WesModes 실제로 파이썬에서 상수의 개념은 없지만 언제나 ['@ property'] (https://docs.python.org/2/library/functions.html#property) 데코레이터를 사용하여 귀하의 필요를 성취하십시오. 이 링크도 참조하십시오. http://stackoverflow.com/questions/2682745/creating-constant-in-python –

1

init 메소드의 사전을 갖는 것은 질문에 대한 참조에

class Myclass(object): 
     def x(self): 
       return 'x' 

     def y(self): 
       return 'y' 

     def __init__(self): 
       self.EF= { 
         'a':self.x, 
         'b':self.y 
       } 

     def test(self): 
       print self.EF['a']() 

m=Myclass() 
m.test() 
1

작동 할 것입니다. 클래스는 속성 또는 실행 가능 함수의 사전 또는 명명 된 튜플의 일종입니다. 함수 자체는 비헤이비어만을 정의합니다. self은 인스턴스와 관련된 상태의 자루입니다. 해당 함수에 대한 포인터를 다른 곳에 저장하고 클래스의 인스턴스 인 주어진 self을 제공하면 정상적으로 작동합니다.

class MyClass(object): 
    def __init__(self, x): 
     self.x = x 
    def fun(self): 
     return self.x 

i = MyClass(1) 
print i.fun() 

f = MyClass.fun 
i2 = MyClass(2) 

print f(i2) 

당신이이 self 인수로 암시 적으로 i을 통과하고있어 표준 i.fun() 모두를 사용하여 호출합니다.