2011-10-27 3 views
1

내 객체의 __str__() 메소드를 확장하고 싶습니다. str(obj) 현재 읽대체하지 않고 __str __() 확장하기

<mymodule.Test object at 0x2b1f5098f2d0> 

나는 고유 식별자로 주소를 좋아하지만, 몇 가지 속성을 추가 할 수 있습니다. 주소 부분을 유지하면서 이것을 확장하는 가장 좋은 방법은 무엇입니까? 다음과 같이보고 싶습니다.

<mymodule.Test object at 0x2b1f5098f2d: name=foo, isValid=true> 

주소를 저장하는 속성이 없습니다. 파이썬 2.4.3을 사용하고 있습니다.

편집가 : __repr이 작업을 수행하는 방법을 알고 좋겠지 __()

솔루션 (파이썬 2.4.3에 대한) : 당신은 id(obj)와 주소를 얻을 수

def __repr__(self): 
    return "<%s.%s object at %s, name=%s, isValid=%s>" % (self.__module__, 
      self.__class__.__name__, hex(id(self)), self.name, self.isValid) 
+1

우선, 오래된 파이썬 버전을 사용하지 마십시오. 그 외에, 당신이하려고하는 것은'__repr__'입니다. – ThiefMaster

답변

5

. __str__() 대신 __repr__() 메서드를 변경하려고합니다. 등의 작업을 서식 문자열을 사용하여 쉽게 파이썬의 이전 버전에서 물건의 동일한 종류를 할 수

test = Test() 
test.name = "foo" 
test.isValid = True 
print repr(test) 
print str(test) 
print test 

:와

class Test(object): 
    def __repr__(self): 
     repr_template = ("<{0.__class__.__module__}.{0.__class__.__name__}" 
         " object at {1}: name={0.name}, isValid={0.isValid}>") 

     return repr_template.format(self, hex(id(self))) 

시험 : 여기 2.6+ 파이썬에서이 작업을 수행하는 코드입니다 더 명확한 str.format() 구문 대신 "%s". str.format()을 사용하려는 경우 템플릿에 {1:#x}을 사용하고 인수 1을 hex(id(self))에서 간단하게 id(self)으로 변경하여 기본 제공 16 진수 서식 기능을 사용할 수도 있습니다.

+0

나머지는 어떨까요? obj .__ class __.__ name__은 Test를 반환하지만 모듈 이름은 무엇입니까? – shadowland

+0

전체 답변을 편집했습니다. –

+0

그랬습니다. 나는 당신이 제안한대로 % s를 사용해야했습니다. – shadowland

1
class Mine(object): 
    def __str__(self): 
     return object.__str__(self) + " own attributes..." 
+1

이것은 원하는 출력을 생성하지 않습니다. 그는 모든 것을 그의 모범에서 꺽쇠 괄호 안에 넣기를 원합니다. 이렇게하면 원래의 꺾쇠 괄호 세트에있는 원본을 반환하고 자신의 "외부"속성을 추가합니다. –