파이썬에서 세트 방법을 우선적으로 수행합니다
-
06-07-2019 - |
문제
세트의 저장을 위해 객체를 자동으로 다른 양식으로 변환하는 사용자 정의 세트를 만들고 싶습니다 ( 파이썬 사전을 키가 아닌 주요로 사용합니다) 배경.
내가 재정의 경우 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)