이 글의 내용은 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!