list
은 클래스에 __str__
메소드가 있는지 신경 쓰지 않습니다.
개체를 인쇄 할 때 print
은 개체에 str
을 호출하여 적합한 문자열을 가져옵니다. str
함수는 개체의 __str__
메서드를 호출하려고 시도하지만, 이없는 경우이 있으면 개체의 __repr__
메서드를 대신 호출합니다. 그리고 그 객체의 클래스 정의에 __repr__
에 대한 정의가 없다면 부모 클래스에서 상속받은 객체를 얻습니다. 일반적으로 object
유형의 기본값 인 __repr__
이됩니다.
list
과 다른 __str__
방법이없는 tuple
, set
및 dict
같은 컬렉션을 내장, 그래서 당신은 (하나가 명시 적으로 print
를 통해 암시 적으로 str
기능을 사용하거나) 자신의 __repr__
문자열로 변환 할 때 메서드가 호출됩니다. 그리고 그 __repr__
메서드는 차례로 컬렉션의 각 항목에 대해 repr
을 호출합니다. 따라서 컬렉션 개체를 print
으로 전달하면 항목 중 __repr__
이 항상 표시됩니다. 그리고 컬렉션에 str
라고 명시 적으로 전화하면 아무런 효과가 없습니다.
list
또는 컬렉션에있는 항목의 __str__
표현을 보려면 컬렉션을 반복해야하며 각 항목에 명시 적으로 str
을 호출해야합니다.
다음은 이러한 점을 보여주는 작은 코드 단편입니다 (Python 2 & 3에 적합 함). 출력
3075508812 3075508812
[Test repr, Test repr] [Test repr, Test repr] [Test repr, Test repr]
Test str Test str Test repr
Test str Test str Test repr
from __future__ import print_function
class Test(object):
def __str__(self):
return 'Test str'
def __repr__(self):
return 'Test repr'
a = [Test(), Test()]
print(id(a.__repr__), id(a.__str__))
print(a, str(a), repr(a))
for u in a:
print(u, str(u), repr(u))
그래서 당신은 하나의 개체로 개체의 목록을 인쇄 할 수 있도록 원하는 객체의 문자열이 더 인간 친화적이있는 경우, 당신은 몇 가지있다 선택 :
변경 __repr__
로 __str__
메소드의 이름. 이것은 가장 간단한 방법이며 앞서 말했듯이 객체가 str
으로 전달 될 때 __str__
을 찾을 수없는 경우 __repr__
이 사용됩니다.
기존의 __str__
방법을 그대로두고보다 인간 친화적 인 __repr__
을 만듭니다.그러나 __repr__
은 프로그래머에게 유용한 정보를 표시하고, __repr__
문자열을 복사하여 &을 인터프리터 나 스크립트에 붙여 넣어 개체를 다시 만들면 좋습니다.
기존의 __str__
메서드를 그대로두고 __str__
을 호출하는 __repr__
을 만듭니다. 유효하지만 이것은 약간 바보입니다. 관련 전략은 __str__
을 참조하는 클래스 속성으로 __repr__
을 설정하는 것입니다. 아래 예제를 참조하십시오.
class Test(object):
def __str__(self):
return 'Test str'
__repr__ = __str__
는 대신 무엇을 기대합니까? –
if 조건과 관련하여 개체 목록을 인쇄 할 것으로 예상합니다. 나는 __str__ 메소드를 구현했다. 충분하지 않아야합니까? – Binary
그것이 무엇입니까. 하나의 Person 객체로 목록을 인쇄합니다. 파이썬이 객체를 인쇄하는 기본 방법을 볼 수 있습니다. –