문제

세트의 저장을 위해 객체를 자동으로 다른 양식으로 변환하는 사용자 정의 세트를 만들고 싶습니다 ( 파이썬 사전을 키가 아닌 주요로 사용합니다) 배경.

내가 재정의 경우 add, remove, __contains__, __str__, update, __iter__, 다른 작업이 올바르게 행동하게하기에 충분합니까, 아니면 다른 것을 무시해야합니까?

도움이 되었습니까?

해결책

작업 collections@kaizer.se가 제안한 것처럼 초록 클래스는 2.6의 적절한 솔루션입니다 (Super를 호출하려는 이유는 확실하지 않습니다. 상속보다는 격리로 가장 잘 수행 할 수없는 어떤 기능을 위임하려고합니까?!) .

당신이 얻지 못하는 것은 사실입니다 update - 추상적 인 방법을 제공함으로써 __le__, __lt__, __eq__, __ne__, __gt__, __ge__, __and__, __or__ __sub__, __xor__, and isdisjoint (에서 collections.Set) 더하기 clear, pop, remove, __ior__, __iand__, __ixor__, and __isub__ (에서 collections.MutableSet), 서브 클래스에서 얻는 것보다 훨씬 더 많은 set (당신이 무시 해야하는 곳 모든 관심의 방법). 원하는 다른 세트 방법을 제공해야합니다.

추상 기본 클래스는 다음과 같습니다 collections.Set 다음과 같은 빌드 딘을 포함하여 콘크리트 클래스와는 상당히 다른 짐승입니다. set 그리고 (2.6) 좋은 늙었습니다 sets.Set, 감가 상각되었지만 여전히 주변 (파이썬 3에서 제거). ABC는 상속을 의미합니다 (그리고 필요한 모든 추상 방법을 구현하면 일부 방법을 합성 할 수 있습니다. (만들다 isinstance 더 유용하고 유용합니다).

Python 3.1 및 2.6의 작업 예는 다음과 같습니다 (3.1은 3.0을 사용해야 할 이유가 없으며 3.1을 사용해야합니다.

import collections

class LowercasingSet(collections.MutableSet):
  def __init__(self, initvalue=()):
    self._theset = set()
    for x in initvalue: self.add(x)
  def add(self, item):
    self._theset.add(item.lower())
  def discard(self, item):
    self._theset.discard(item.lower())
  def __iter__(self):
    return iter(self._theset)
  def __len__(self):
    return len(self._theset)
  def __contains__(self, item):
    try:
      return item.lower() in self._theset
    except AttributeError:
      return False

다른 팁

파이썬에서 2.6 :

import collections
print collections.MutableSet.__abstractmethods__
# prints:
# frozenset(['discard', 'add', '__iter__', '__len__', '__contains__'])

아강 collections.MutableSet 위 목록의 메소드를 무시하십시오.

위의 최소값이 구현되었다는 점을 감안할 때 업데이트 방법 자체는 매우 쉽습니다.

def update(self, iterable):
    for x in iterable:
        self.add(x)
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top