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__ 함수는 객체를 반환합니다. 반복할 때 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__ function
위는 __iter__ 함수를 구현하여 객체를 구현합니다. .
그래서 첨자로 요소를 추출하는 객체를 구현하는 방법은 무엇입니까?
이 작업은 개체의 __getitem__ 메서드를 구현하여 수행됩니다.
하나 드려요