2011-08-22 7 views
35

UserDict, dictABC의 차이점은 무엇입니까? 문서가 UserDict을 비추천입니까?하위 클래스 dict : UserDict, dict 또는 ABC?

또한 은 아니지만 UserDict의 update()은 내 setitem 방법을 사용하는 것 같습니다. 어느 메서드가 실제로 사용자 정의 setitemgetitem 기능을 원한다면 재정의하는 데 필수적입니까?

ABC s 기본 구현을 제공하지 않으므로 절대적으로 모든 메소드를 구현해야합니다.

나는 두 가지 않는다는 dict을 만들고 싶어 :

  • intern() 모든 키와 SQLite 데이터베이스

  • 저장 값의 일부를 값 그래서의 UserDict, dictABC을 사용하면이 작업을 수행하는 것이 가장 좋습니다.

  • +0

    그러나 적어도 일부 ABC는 내장 된 유형을 기반으로하지 않는 구현을 단순화하는 데 유용합니다. 동일한 섹션의이 스 니펫은 다음과 같이 표시합니다. '일부 ABC는 믹스 인으로도 유용하여 쉽게 사용할 수 있습니다 컨테이너 API를 지원하는 클래스를 개발한다. 예를 들어 전체 Set API를 지원하는 클래스를 작성하려면 __contains __(), __iter __() 및 __len __()의 세 가지 기본 추상 메서드 만 제공하면됩니다. ABC는 __ 및 __() 및 isdisjoint()와 같은 나머지 메서드를 제공합니다. – delnan

    +1

    무언가가 "dict"인지 테스트하려면 'isistance (x, dict)'를 사용하십시오. 테스트하고 싶다면 'isinstance (x, Mapping)'을 사용하십시오. 이것은 ABC가있는 것입니다. 그것들은 모든 종류의 매핑이'Mapping.register()'를 사용하거나 그것을 직접적으로 하위 클래스로 사용하는 경우에만 유용합니다. 그리고 네, ** ** ABC의 주된 목적입니다. –

    답변

    36

    실제로 데이터를 보유하는 사용자 지정 컬렉션을 원할 경우 dict 하위 클래스입니다. 이는 인터페이스를 확장하려는 경우 (예 : 메소드 추가) 유용합니다.

    사용자 정의 __getitem__/__setitem__을 호출하는 기본 제공 방법은 없습니다. 이들을 완전히 제어해야하는 경우 collections.MutableMapping 추상 기본 클래스를 대신 구현하는 사용자 정의 클래스를 만듭니다.

    ABC는 실제 데이터를 저장하는 수단을 제공하지 않으며 일부 메소드의 기본 구현이있는 인터페이스 만 제공합니다. 그러나 이러한 기본 구현은 사용자 정의 __getitem____setitem__을 호출합니다. 데이터를 저장하려면 dict 내부를 사용해야하며 모든 추상 메소드는 __len__, __iter__, __getitem__, __setitem____delitem__과 같이 구현해야합니다.

    (파이썬 2 모듈뿐만 아니라 UserDict라고한다)를 collections 모듈로부터 클래스 UserDictMutableMapping ABC 구현 내부 dict 래퍼이다. dict의 동작을 사용자 정의하려는 경우이 구현이 출발점이 될 수 있습니다. 요약

    :

    • 을 MutableMapping 인터페이스를 정의합니다. dict처럼 작동하는 것을 만들기 위해 이것을 서브 클래 싱하십시오. 데이터를 저장하는 방법 및 저장 방법은 전적으로 귀하에게 달려 있습니다.
    • UserDict은 내부 "실제"dict을 저장소로 사용하여 MutableMapping을 구현 한 것입니다. dict-like 스토리지 콜렉션을 원하지만 dict에 의해 노출 된 일부 메소드를 대체하는 경우, 이는 좋은 시작점 일 수 있습니다. 그러나 메소드를 재정의 할 때 일관성을 유지할 수 있도록 기본 메소드가 구현되는 방법을 알려면 코드를 읽으십시오.
    • dict은 "진짜"입니다. 을 서브 클래 싱하려면 인터페이스를 확장하십시오. 사용자 정의 작업을 수행하는 메소드를 대체하는 것은 일반적으로 데이터에 액세스하는 여러 가지 방법이 있으므로 위험 할 수 있으며 일관성없는 API로 끝날 수 있습니다.
    +0

    이전 게시물에서 Mixins에 대해 배웠고 이제는 ABC가 기본 구현을 제공한다는 사실을 깨달았다. 데이터 변수를 직접 제공하는 것은 사소한 문제이지만, – Gerenuk

    +0

    @agf : DictMixin조차 5 가지 기본 메소드를 구현해야합니다. –

    +0

    @agf : 'userdict' 모듈은 Python 3.0에서 사라 졌으므로이 부분이 더 이상 사용되지 않습니다. http://www.python.org/dev/peps/pep-3108/ (인용문 : "유형이 수퍼 클래스 일 수 있기 때문에 유용하지는 않습니다. 유용한 비트가 '모듈'모듈로 옮겨졌습니다.) –

    2

    UserDict 클래스를 사용하지 마십시오. 필요하지 않습니다. 문서에서 알 수 있듯이 dict을 직접 서브 클래 싱 할 수 있습니다.

    그러나, 당신은 여전히 ​​DictMixin에 대한 UserDict 모듈을 원하는 :

    참고 : 공식적으로 사용되지 않으면 서DictMixin이, 파이썬 3에서 제거되었습니다, 그리고 그것은 당신이 collections.MutableMapping을 사용하는 문서에 좋습니다. 그러나 단점이 있습니다. 사전 인터페이스 (__delitem__, __getitem__, __iter__, __len____setitem__)을 더 구현해야합니다. DictMixin을 사용하면 변경하려는 항목을 구현할 수 있으며 나머지는 기본 구현을 사용합니다.

    from UserDict import DictMixin 
    
    class MyDict(DictMixin, dict): 
        def __setitem__(self, key, value): 
         print key, value # just an example 
         # use intern(key) or whatever here 
         dict.__setitem__(self, key, value) # or 
         # super(MyDict, self).__setitem__(key, value) 
    
    m = MyDict() 
    
    m['a'] = 'b' 
    # a b 
    m.update({'a': 'c'}) 
    # a c 
    

    자동으로 update 당신이 __setitem__ 당신이 원하는대로 사용할 것.

    +3

    > Python 버전 2.6부터는 DictMixin 대신 collections.MutableMapping을 사용하는 것이 좋습니다. – cwallenpoole

    +3

    @agf : 틀렸어. 'UserDict' 모듈은 더 이상 사용되지 않아야합니다. 믹스 인으로'collections.MutableMapping'을 사용하는 것보다'UserDict.DictMixin'을 믹스 인으로 사용하는 것이 더 쉬운가요? 두 경우 모두'__setitem __()'만 덮어 써야합니다. –

    +0

    @agf : 전체 모듈이 Python 3.x에서 사라졌습니다. –

    관련 문제