2016-11-20 2 views
1

그래서 나는 다음과 같은 기능이 있습니다개체 클래스를 목록에 추가하려면 어떻게합니까?

def find_by_name(self, name): 
    fitting_list = [p for p in self.__persons if name.lower() in p.name.lower()] 
    return fitting_list 

을 내가 목록을 인쇄 할 때 다음과 같은 출력을 얻을 :

[<src.store.domain.person.Person object at 0x000001F88705B128>] 

왜 이런 일이 않고, 내가 그것을 어떻게 해결할 수 있습니까?

+0

는 대신 무엇을 기대합니까? –

+0

if 조건과 관련하여 개체 목록을 인쇄 할 것으로 예상합니다. 나는 __str__ 메소드를 구현했다. 충분하지 않아야합니까? – Binary

+0

그것이 무엇입니까. 하나의 Person 객체로 목록을 인쇄합니다. 파이썬이 객체를 인쇄하는 기본 방법을 볼 수 있습니다. –

답변

1

list은 클래스에 __str__ 메소드가 있는지 신경 쓰지 않습니다.

개체를 인쇄 할 때 print은 개체에 str을 호출하여 적합한 문자열을 가져옵니다. str 함수는 개체의 __str__ 메서드를 호출하려고 시도하지만, 이없는 경우이 있으면 개체의 __repr__ 메서드를 대신 호출합니다. 그리고 그 객체의 클래스 정의에 __repr__에 대한 정의가 없다면 부모 클래스에서 상속받은 객체를 얻습니다. 일반적으로 object 유형의 기본값 인 __repr__이됩니다.

list과 다른 __str__ 방법이없는 tuple, setdict 같은 컬렉션을 내장, 그래서 당신은 (하나가 명시 적으로 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)) 

그래서 당신은 하나의 개체로 개체의 목록을 인쇄 할 수 있도록 원하는 객체의 문자열이 더 인간 친화적이있는 경우, 당신은 몇 가지있다 선택 :

  1. 변경 __repr____str__ 메소드의 이름. 이것은 가장 간단한 방법이며 앞서 말했듯이 객체가 str으로 전달 될 때 __str__을 찾을 수없는 경우 __repr__이 사용됩니다.

  2. 기존의 __str__ 방법을 그대로두고보다 인간 친화적 인 __repr__을 만듭니다.그러나 __repr__은 프로그래머에게 유용한 정보를 표시하고, __repr__ 문자열을 복사하여 &을 인터프리터 나 스크립트에 붙여 넣어 개체를 다시 만들면 좋습니다.

  3. 기존의 __str__ 메서드를 그대로두고 __str__을 호출하는 __repr__을 만듭니다. 유효하지만 이것은 약간 바보입니다. 관련 전략은 __str__을 참조하는 클래스 속성으로 __repr__을 설정하는 것입니다. 아래 예제를 참조하십시오.

class Test(object): 
    def __str__(self): 
     return 'Test str' 
    __repr__ = __str__ 
+0

정말 고마워요. 이것은 나를 찾은 다른 튜토리얼보다 훨씬 __str__ methoc을 더 잘 이해하게합니다. – Binary

3

이것은 객체의 __repr__입니다. __repr__은 개체를 컴퓨터가 읽을 수있는 형식으로 만들어 졌으므로이를 덮어서 변경할 수 있습니다.

관련 문제