2009-03-25 6 views
2

이것은이 솔루션을 구현할 때의 상황을 설명하기가 쉽지 않으므로 매우 고안된 예제입니다. 그러나이 특별한 특성이 왜 발생하는지 누구든지 대답 할 수 있다면 감사 할 것입니다.파이썬에서 함수 정의 리디렉션

예 :

class A(dict): 
    def __init__(self): 
     self['a'] = 'success' 

    def __getitem__(self, name): 
     print 'getitem' 
     return dict.__getitem__(name) 

class B(object): 
    def __init__(self): 
     self._a = A() 
     setattr(self, '__getitem__', self._a.__getitem__) 

b = B() 
c = b['a'] 

이 출력 : 그것은 (확실히 더 논리적 일 것입니다 서브 클래스)이 일의 기괴한 방법은 비록

c = b['a'] 
TypeError: 'B' object is unsubscriptable 

, 왜 방법을 찾을 수 없습니다 명시 적으로 설정 했습니까? 내가 이렇게하면

:

dir(b) 

내가이 얻을 :

['__class__', '__delattr__', '__dict__', '__doc__', '__getattribute__', '__getitem__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__str__', '__weakref__', '_a'] 

같은 문제는 __iter__ 같은 다른 방법으로 발생합니다. 작동하는이 메서드를 명시 적으로 정의하는 것은 무엇입니까?

+0

힌트 :

여기에 적응 당신의 코드는 그것을 설명하기 쉽지 않은 경우, 그것은 좋은 생각이 아니다. 목표에 대한 고안된 경로 대신 목표를 설명해보십시오. 누군가는 당신에게 덜 인위적인 것을 줄 수 있습니다. –

+0

알았어, 당연하지, 내가 해결할 실제 문제에 대한 질문을 올리면이 문제를 해결하는 가장 좋은 방법이 무엇이라고 생각하는지 알 수있다. – Dan

+0

Dan :이 질문에 도달했으며 컨텍스트가 무엇인지 궁금한 사람들을위한 링크를 게시 할 수 있습니까? – MatrixFrog

답변

7

대괄호를 사용하는 경우 [] 파이썬이 클래스를 찾습니다. 클래스에 메서드를 설정해야합니다.

class A(dict): 
    def __init__(self): 
     self['a'] = 'success' 

    def __getitem__(self, name): 
     print 'getitem!' 
     return dict.__getitem__(self, name) 

class B(object): 
    def __init__(self): 
     self._a = A() 
     B.__getitem__ = self._a.__getitem__ 

b = B() 
c = b['a'] 
+0

잠깐만, 인스턴스 메서드에 클래스 메서드를 지정하면 모든 인스턴스 B에 대해 동일한 인스턴스를 가리 키지 않을까요? – Dan

+0

@ Dan : 예. __getitem__은 전체 클래스에서만 작동합니다. 인스턴스 당 __getitem__은 없습니다. – nosklo

1

즉석에서 특수 클래스 메서드를 재정의 할 수 없기 때문입니다.

이것에 대한 참조를 찾을 수 없지만 기본적으로 클래스 메소드이고 인스턴스 메소드가 될 수 없기 때문에 기본적으로 찾을 수 있습니다.

+0

당신은 즉시 오버라이드 할 수 있습니다. 단점은 Dan이 클래스 메소드 대신 인스턴스 메소드를 엉망으로 만든다는 것입니다. –

+0

spot on,이 의미에서 인스턴스 메소드와 클래스 메소드의 차이를 이해하지 못했습니다. 감사. – Dan