>백엔드 개발 >파이썬 튜토리얼 >슬라이싱 기능을 구현하기 위한 Python 사용자 정의 객체 소개(코드 예)

슬라이싱 기능을 구현하기 위한 Python 사용자 정의 객체 소개(코드 예)

不言
不言앞으로
2018-12-30 10:40:502792검색

이 글의 내용은 Python 사용자 정의 객체의 슬라이싱 기능(코드 예제)에 대한 소개입니다. 필요한 친구들이 참고할 수 있기를 바랍니다.

1. 매직 메소드: __getitem__()

클래스를 정의할 때 매직 메소드 __getitem__()를 구현하기만 하면 사용자 정의 객체가 슬라이싱 구문을 지원하도록 만드는 것이 어렵지 않습니다. 그럼 먼저 이 방법을 소개하겠습니다.

구문: ​​object.__getitem__(self, key)

공식 문서 해석: 호출됨 self[key] 평가를 구현하려면 시퀀스 유형이 허용됩니다. 키는 정수여야 하고 슬라이스 객체여야 합니다. 음수 인덱스 해석(클래스가 시퀀스 유형)은 __getitem__() 메서드에 따라 다릅니다. 부적절한 유형의 값인 경우 TypeError가 발생할 수 있습니다. 시퀀스의 인덱스 집합 외부(특수 항목 이후) 음수 값 해석), IndexError가 발생해야 합니다. 매핑 유형, 키가 누락된 경우(컨테이너에 없음) KeyError는 다음과 같습니다.

요약 번역: __getitem__() 메서드는 매개변수 키를 반환하는 데 사용됩니다. 해당 값인 이 키는 정수 값 또는 슬라이스 객체일 수 있으며 키가 위의 두 가지 유형이 아닌 경우 음수 인덱스를 지원합니다. TypeError; 인덱스가 범위를 벗어나면 IndexError가 발생합니다. 매핑 유형이 정의되어 있으면 키 매개변수가 해당 객체의 키 값이 아닌 경우 발생합니다. 키 오류.

2. 슬라이싱 기능 구현을 위한 시퀀스 맞춤화

다음으로 간단한 MyList를 정의하고 여기에 슬라이싱 기능을 추가합니다. (PS: 데모용일 뿐이며 다른 기능의 완전성은 보장되지 않습니다.)

class MyList():
    def __init__(self):
        self.data = []
    def append(self, item):
        self.data.append(item)
    def __getitem__(self, key):
        print("key is : " + str(key))
        return self.data[key]

l = MyList()
l.append("My")
l.append("name")
l.append("is")
l.append("Python猫")

print(l[3])
print(l[:2])
print(l['hi'])

### 输出结果:
key is : 3
Python猫
key is : slice(None, 2, None)
['My', 'name']
key is : hi
Traceback (most recent call last):
...
TypeError: list indices must be integers or slices, not str

출력 결과를 보면 맞춤형 MyList는 인덱스별 검색과 슬라이싱 작업을 모두 지원하는데, 이것이 바로 우리의 목적입니다.

특별히 참고할 점은 이 예에서 __getitem__()입니다. 이 메소드는 다양한 매개변수 유형에 따라 다양한 기능(인덱스 비트 값 또는 슬라이스 값 가져오기)을 구현하고 예외도 적절하게 처리하므로 번거로운 처리 논리를 작성할 필요가 없습니다. 완전히 오해를 불러일으키는 학습 자료가 인터넷에 많이 있습니다. 이러한 자료에서는 다양한 유형의 매개변수를 구별한 다음 색인 검색 및 슬라이싱 구문을 구현하는 큰 코드를 작성하는 방법을 가르칩니다. 다음은 대표적인 오류 예시입니다.

###略去其它代码####
def __getitem__(self, index):
    cls = type(self)
    if isinstance(index, slice):  # 如果index是个切片类型,则构造新实例
       return cls(self._components[index])
    elif isinstance(index, numbers.Integral):  # 如果index是个数,则直接返回
        return self._components[index]
    else:
        msg = "{cls.__name__} indices must be integers"
        raise TypeError(msg.format(cls=cls))

3. 슬라이싱 기능 구현을 위한 커스텀 사전

슬라이싱은 시퀀스형의 기능이므로 위 예시에서는 슬라이싱의 구체적인 구현 로직을 작성할 필요가 없습니다. . 그러나 다른 비순차적 유형의 사용자 정의 개체의 경우에는 슬라이싱 논리를 직접 구현해야 합니다. 사용자 정의 사전을 예로 들어 보겠습니다(PS: 이는 데모용일 뿐이며 다른 기능의 완전성은 보장되지 않습니다):

class MyDict():
    def __init__(self):
        self.data = {}
    def __len__(self):
        return len(self.data)
    def append(self, item):
        self.data[len(self)] = item
    def __getitem__(self, key):
        if isinstance(key, int):
            return self.data[key]
        if isinstance(key, slice):
            slicedkeys = list(self.data.keys())[key]
            return {k: self.data[k] for k in slicedkeys}
        else:
            raise TypeError

d = MyDict()
d.append("My")
d.append("name")
d.append("is")
d.append("Python猫")
print(d[2])
print(d[:2])
print(d[-4:-2])
print(d['hi'])

### 输出结果:
is
{0: 'My', 1: 'name'}
{0: 'My', 1: 'name'}
Traceback (most recent call last):
...
TypeError

위 예의 핵심은 핵심은 범위를 벗어난 인덱스와 음수 인덱스에 대해 걱정할 필요가 없으며 사전 슬라이스가 사전 키 값의 슬라이스로 변환된다는 것입니다. 드디어 달성됩니다.

4. 요약

최종 요약: 이 글은 __getitem__() 매직 메소드를 소개하고 사용자 정의 객체의 슬라이싱 기능을 구현하는 데 사용됩니다(목록 유형 및 사전 유형을 예로 들어). 너.

위 내용은 슬라이싱 기능을 구현하기 위한 Python 사용자 정의 객체 소개(코드 예)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 segmentfault.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제