>  기사  >  백엔드 개발  >  Python 연구 노트 - 사용자 정의 클래스를 내장 유형과 비슷하게 만드는 마법의 방법

Python 연구 노트 - 사용자 정의 클래스를 내장 유형과 비슷하게 만드는 마법의 방법

高洛峰
高洛峰원래의
2017-02-18 10:46:021187검색

Python의 매직 메소드는 Python에서 __XXX__ 유형의 사전 정의된 함수입니다.
Python의 매직 메소드 사용의 가장 큰 장점은 Python이 객체가 내장 유형처럼 동작하도록 하는 간단한 메소드를 제공한다는 것입니다.

__str__ 함수

__str__ 함수는 인스턴스 자체를 인쇄할 때 출력 내용을 처리하는 데 사용됩니다. 이 함수를 재정의하지 않으면 기본적으로 개체 이름과 메모리 주소가 출력됩니다.
예:

>>> class Student(object):
...     def __init__(self,name):
...             self._name = name
...
>>> print Student()

출력: <__main__.Student object at 0x0000000002A929E8>.
그렇다면 어떻게 출력 결과를 더 읽기 쉽게 만들 수 있을까요? __str__ 함수를 재정의할 수 있습니다. 예를 들어

>>> class Student(object):
...     def __init__(self, name):
...             self._name = name
...     def __str__(self):
...             return  "I'm a student, named %s" % self._name
...
>>> print Student("Charlie")

의 출력 결과는 I'm a student, named Charlie입니다.
str() 함수를 개체에 적용하면 실제로 개체의 __str__ 함수를 호출합니다.

_repr_ 함수

__repr__도 객체를 직렬화하지만 __repr__는 Python 컴파일러가 볼 수 있는 더 많은 기능입니다. __str__가독성이 더 중요합니다.
repr() 함수를 객체에 적용할 때 우리가 실제로 호출하는 것은 해당 함수의 __repr__ 함수입니다.

repr()와 짝을 이루는 eval() 기능입니다. eval()직렬화된 객체를 다시 객체로 변환하는 기능입니다. 전제는 객체가 __repr__ 함수를 구현한다는 것입니다.

위 문단은 본인의 이해에 기초한 것으로 옳고 그름을 알 수 없습니다.

>>> item = [1,2,3]
>>> repr(item)
'[1, 2, 3]'
>>> other_item = eval(repr(item))
>>> other_item[1]
2

__iter__ 함수

목록이나 튜플을 반복할 때 for...in...을 자주 사용합니다. 그것은 Iterable에서 목록을 상속받은 것입니다. Iterable은 __iter__ 함수를 구현합니다.

사용자 정의 개체를 반복 가능한 개체로 바꾸려면 __iter__next라는 두 가지 메서드를 구현해야 합니다.

__iter__함수는 개체를 반환합니다. 반복할 때 next가 캡처되어 중지될 때까지 StopIteration 함수가 계속 호출되어 다음 값을 가져옵니다.
Liao Xuefeng 선생님의 튜토리얼은 __next__ 메소드를 작성하는데 왜 그런지 모르겠습니다.

class Fib(object):
    def __init__(self):
        self.a, self.b = 0, 1

    def __iter__(self):
        return self

    def next(self):
        self.a, self.b = self.b, self.a + self.b
        if self.a > 10000:
            raise StopIteration
        return self.a


for i in Fib():
    print i

__getitem__ 함수

위에서는 __iter__ 함수를 구현하여 객체의 반복을 구현합니다.
그래서 첨자로 요소를 추출하는 객체를 구현하는 방법은 무엇입니까?
이 작업은 개체의 __getitem__ 메서드를 구현하여 수행됩니다.
하나 드려요

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.