Python의 매직 메소드는 Python에서 __XXX__
유형의 사전 정의된 함수입니다.
Python의 매직 메소드 사용의 가장 큰 장점은 Python이 객체가 내장 유형처럼 동작하도록 하는 간단한 메소드를 제공한다는 것입니다.
__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__
는 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
목록이나 튜플을 반복할 때 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
위에서는 __iter__
함수를 구현하여 객체의 반복을 구현합니다.
그래서 첨자로 요소를 추출하는 객체를 구현하는 방법은 무엇입니까?
이 작업은 개체의 __getitem__
메서드를 구현하여 수행됩니다.
하나 드려요