2012-03-31 2 views
11

레이몬드 Hettinger showed 컬렉션 클래스를 결합 할 수있는 정말 멋진 방법 :OrderedDict에서 서브 클래 싱과 defaultdict

from collections import Counter, OrderedDict 
class OrderedCounter(Counter, OrderedDict): 
    pass 
# if pickle support is desired, see original post 

내가 OrderedDict 및 defaultdict 비슷한 일을하고 싶다. 물론 defaultdict는 __init__ 서명이 다르므로 추가 작업이 필요합니다. 이 문제를 해결하는 가장 깨끗한 방법은 무엇입니까? 나는 파이썬 3.3을 사용한다.

여기서 좋은 해결책을 찾았습니다 : https://stackoverflow.com/a/4127426/336527,하지만 어쩌면 defaultdict에서 파생 된 것이 더 간단 할 수도 있습니다.

+3

그 클래스에 대한 명시적인'super'-delegation없이? 왜냐하면 평소처럼'dict'에 직접가는 대신'OrderedDict'를 통해 재 라우팅되는 'Counter'내의 어딘가에서'super '호출이 있었기 때문입니까? 아니면 그냥? –

+0

@KarlKnechtel 당신은'OrderedCounter'를 의미하지만 좋은 질문입니다. – agf

+0

@ 예, 그렇습니다. Stupid edit timeout ... :( –

답변

7

OrderedDict에서 상속받은 답변과 마찬가지로 가장 간단한 방법입니다. 팩토리 함수에서 기본값을 얻는 것보다 정렬 된 저장소를 구현하는 것이 더 많은 작업입니다.

defaultdict에 구현해야하는 모든 사항은 __init__ 사용자 지정 비트이며 __missing__ 매우 간단합니다. 대신 defaultdict에서 상속하는 경우

것은, 당신은 위임 또는 적어도 __setitem__, __delitem____iter__가에 차 작업을 재현하기 위해 다시 구현해야합니다. __init__에서 설치 작업을해야하지만 필요에 따라 일부 다른 방법을 상속하거나 생략 할 수도 있습니다.

무엇이 수반되는지에 대해서는 the original recipe 또는 any of the others linked to from another Stack Overflow question을보십시오.

3

내가 그들을 하위 클래스로 할 수있는 방법을 발견했습니다 모두 버그가 아니라 확인하는 경우 :

우리는 누군가가 OrderedDict 예 실제로 OrderedDict 기능을 얻는 방법을 나에게 설명 할 수있는 주제에있는 동안
class OrderedDefaultDict(defaultdict, OrderedDict): 
    def __init__(self, default, *args, **kwargs): 
     defaultdict.__init__(self, default) 
     OrderedDict.__init__(self, *args, **kwargs) 
+0

두 개의 내부 사전을 만들지 않습니까? – leewz

+0

아, 알겠습니다. 원래 질문에서 링크 된 게시물을 읽습니다. – leewz