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

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

不言
풀어 주다: 2018-12-30 10:40:50
앞으로
2898명이 탐색했습니다.

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

1. 매직 메소드: __getitem__()

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

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

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

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

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

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

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

1

2

3

4

5

6

7

8

9

10

###略去其它代码####

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: 이는 데모용일 뿐이며 다른 기능의 완전성은 보장되지 않습니다):

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

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

관련 라벨:
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿