2017-11-27 15 views
-2

, 내가 부모 클래스 대신 클래스 메서드에 super()을 사용할 수 있어야합니다 :configparser 생성자에서 super()를 사용할 수없는 이유는 무엇입니까? 파이썬 3에서

class demodict(OrderedDict): 

    def __setitem__(self, key, val): 
     print(key) 
     super().__setitem__(self, key, val) 

나는 demodict()를 인스턴스화하고 여기에 값을 추가 할 때 예상대로 위의 동작합니다가. 나는 ConfigParser 개체의 데이터 형식으로 사용하지만, 뭔가 잘못 :

>>> Config = configparser.ConfigParser(dict_type=demodict) 
Traceback (most recent call last): 
    File "<pyshell#15>", line 1, in <module> 
    conf = configparser.ConfigParser(dict_type=demodict) 
    File ".../anaconda/lib/python3.4/configparser.py", line 588, in __init__ 
    self._proxies[default_section] = SectionProxy(self, default_section) 
    File "<pyshell#14>", line 5, in __setitem__ 
    super().__setitem__(self, key, val) 
    File ".../anaconda/lib/python3.4/collections/__init__.py", line 67, in __setitem__ 
    if key not in self: 
TypeError: unhashable type: 'demodict' 

내가 부모 클래스와 일반 dictOrderedDict을 교체하는 경우는, 에러도 괴상 가져옵니다

Traceback (most recent call last): 
    File "<pyshell#9>", line 1, in <module> 
    conf = configparser.ConfigParser(dict_type=demodict) 
    File ".../anaconda/lib/python3.4/configparser.py", line 588, in __init__ 
    self._proxies[default_section] = SectionProxy(self, default_section) 
    File "<pyshell#7>", line 6, in __setitem__ 
    super().__setitem__(self, key, val) 
TypeError: expected 2 arguments, got 3 

super() 대신 OrderedDict 또는 dict을 명시 적으로 입력하면 demodictdict_type으로 사용할 수 있습니다. 누군가 일어나는 일을 설명 할 수 있습니까? (쉬운 해결 방법이 있기 때문에 나는 해결책에 대한 것보다 더 많은 원인이 궁금합니다 ...)

+3

super() .__ setitem__은 자동으로 첫 번째 인수로 'self'를 전달합니다. 그것은'super() .__ setitem __ (key, val)'을 그냥 수행하면 작동합니다. – vaultah

+0

실제로! 그것은 그 문제를 해결했습니다. Duh, 그러나 또한, 얼마나 이상한. 나는'super()'에있는 문서를 좀 더주의 깊게 읽어야했다. 설명과 함께 대답으로 써 주시겠습니까? – alexis

+0

나는 점수를 아끼지 만, 왜 누군가가 이것이 나쁜 질문이라고 생각하는지 궁금합니다. – alexis

답변

1

일반적인 메서드 바인딩처럼 super() 프록시 개체에서 메서드 특성 액세스는 다음과 같이 암시 적으로 개체를 전달합니다. 최초의 위치 인수

변경이 : 여기에

super().__setitem__(self, key, val) 

는 :

super().__setitem__(key, val) 

OrderedDict doesn't use cooperative inheritance 것을, 즉 그냥 직접 dict.__setitem__를 호출합니다. 이상적으로, 상속 체인의 모든 객체는 super을 사용해야합니다. OrderedDict을 다중 상속 구조와 함께 사용하려면주의해서 진행하십시오.

+2

"vaultah의 코멘트에 따르면 전달 된 자기가 아니라 프록시 객체입니다."- 무슨 말씀을 하시겠습니까? – user2357112

+0

'self'는'demodict' 인스턴스이고'super()'는'super' 인스턴스입니다. – wim

+2

'super()'는'super' 인스턴스가 될 것이지만,'super()'객체는'self'라는 수퍼 클래스'__setitem__' 메소드에 넘겨 질 것이 아닙니다. – user2357112