python - 특수 - 파이썬3 print




print()를 사용하여 클래스의 객체를 인쇄하는 방법? (8)

나는 파이썬으로 로프를 배우고있다. print() 함수를 사용하여 Foobar 클래스의 객체를 인쇄하려고하면 다음과 같은 출력이 표시됩니다.

<__main__.Foobar instance at 0x7ff2a18c>

클래스 및 그 객체인쇄 동작 (또는 문자열 표현 )을 설정할 수있는 방법이 있습니까? 예를 들어, 클래스 객체에서 print() 를 호출하면 데이터 멤버를 특정 형식으로 인쇄하려고합니다. 이것을 파이썬에서 어떻게 달성 할 수 있습니까?

C ++ 클래스에 익숙하다면 클래스에 friend ostream& operator << (ostream&, const Foobar&) 메소드를 추가하여 표준 ostream 에 대해 위의 내용을 얻을 수 있습니다.


@ dbr의 답변에 두 개의 센트를 추가하기 위해 다음은 그가 인용 한 공식 문서에서이 문장을 구현하는 방법의 예입니다.

"[...]는 eval (), [...]에 전달할 때 같은 값을 가진 객체를 생성하는 문자열을 반환합니다.

주어진이 클래스 정의 :

class Test(object):
    def __init__(self, a, b):
        self._a = a
        self._b = b

    def __str__(self):
        return "An instance of class Test with state: a=%s b=%s" % (self._a, self._b)

    def __repr__(self):
        return 'Test("%s","%s")' % (self._a, self._b)

이제, Test 클래스의 인스턴스를 직렬화하기 쉽습니다.

x = Test('hello', 'world')
print 'Human readable: ', str(x)
print 'Object representation: ', repr(x)
print

y = eval(repr(x))
print 'Human readable: ', str(y)
print 'Object representation: ', repr(y)
print

따라서 마지막 코드를 실행하면 다음과 같이 표시됩니다.

Human readable:  An instance of class Test with state: a=hello b=world
Object representation:  Test("hello","world")

Human readable:  An instance of class Test with state: a=hello b=world
Object representation:  Test("hello","world")

그러나, 내가 마지막 코멘트에서 말했듯이 : 더 많은 정보는 here !


@ user394430의 더 멋진 버전의 응답

class Element:
    def __init__(self, name, symbol, number):
        self.name = name
        self.symbol = symbol
        self.number = number

    def __str__(self):
        return  str(self.__class__) + '\n'+ '\n'.join(('{} = {}'.format(item, self.__dict__[item]) for item in self.__dict__))

elem = Element('my_name', 'some_symbol', 3)
print(elem)

시각적으로 좋은 이름과 값 목록을 생성합니다.

<class '__main__.Element'>
name = my_name
symbol = some_symbol
number = 3

더 멋진 버전 (Ruud에게 감사)은 항목을 정렬합니다.

def __str__(self):
    return  str(self.__class__) + '\n' + '\n'.join((str(item) + ' = ' + str(self.__dict__[item]) for item in sorted(self.__dict__)))

이것의 어느 것도 나를 정말로 돕지 않는다. 나는 인쇄물을 얻기 위해 원래의 물건의 정의를 바꾸고 싶지 않습니다. IOW : 상속을 사용하지 않거나 이러한 str 함수를 클래스에 넣고 싶지 않습니다. 즉 디버깅 할 모든 클래스를 변경해야합니다. 대신 클래스를 가지고 전체 클래스 내용을 인쇄 할 수 있습니다. IOW : 비슷한 것을 가져라.

class Address( ):
  __init__( self )
     self.mName = 'Joe'
     self.mAddress = '123 Easy Street'

a = Address()
print a
or
print printClass( a )

이렇게하면 다음과 같이 출력됩니다.

 Class Address contains:
   mName = 'Joe'
   mAddress = '123 Easy Street'

사용법에 대해 간단하고 간단하며 원본 개체 정의를 변경할 필요가 없습니다. 개체를 해체하는 작은 함수를 만들어야 만한다면 괜찮을 것입니다. 이후로 나는 그것을 수행하는 방법을 알고있는 함수를 간단하게 호출 할 수 있습니다. 원래 클래스 정의를 변경하지 않고도 인라인으로 사용할 수 있습니다.


클래스 내에서 "__str__" 특수 메서드를 사용하기 만하면됩니다. 예를 들어.

class Adiprogrammer :

def __init__(self, name):
    self.company_name = name

def __str__(self):
    return "I am the Founder of Adiprogrammer!"

yash = Adiprogrammer ( "Aaditya")

인쇄 (야쉬)


파이썬 3 :

특정 형식이 중요하지 않은 경우 (예 : 디버깅의 경우) 아래의 Printable 클래스에서 상속합니다. 모든 객체에 대한 코드를 작성할 필요가 없습니다.

this 대답에서 영감을 얻었다.

class Printable:
    def __repr__(self):
        from pprint import pformat
        return "<" + type(self).__name__ + "> " + pformat(vars(self), indent=4, width=1)

# Example Usage
class MyClass(Printable):
    pass

my_obj = MyClass()
my_obj.msg = "Hello"
my_obj.number = "46"
print(my_obj)

__repr__ 을 사용해야합니다. 이것은 __init__ 과 같은 표준 함수입니다. 예 :

class Foobar():
    """This will create Foobar type object."""

    def __init__(self):
        print "Foobar object is created."

    def __repr__(self):
        return "Type what do you want to see here."

a = Foobar()

print a

Chris Lutz가 언급했듯이 , 이것은 클래스의 __repr__ 메소드에 의해 정의됩니다.

repr() 의 문서에서 :

많은 함수에서이 함수는 eval() 전달 될 때 동일한 값을 가진 객체를 반환하는 문자열을 반환하려고 시도합니다. 그렇지 않으면 표현은 함께 객체 유형의 이름이 포함 된 꺾쇠 괄호로 묶인 문자열입니다 종종 개체의 이름과 주소를 포함하는 추가 정보가 있습니다. 클래스는 __repr__() 메서드를 정의하여이 함수가 인스턴스에 대해 반환 할 내용을 제어 할 수 있습니다.

주어진 다음 클래스 Test :

class Test:
    def __init__(self, a, b):
        self.a = a
        self.b = b

    def __repr__(self):
        return "<Test a:%s b:%s>" % (self.a, self.b)

    def __str__(self):
        return "From str method of Test: a is %s, b is %s" % (self.a, self.b)

..it는 Python 셸에서 다음과 같은 방식으로 작동합니다.

>>> t = Test(123, 456)
>>> t
<Test a:123 b:456>
>>> print repr(t)
<Test a:123 b:456>
>>> print(t)
From str method of Test: a is 123, b is 456
>>> print(str(t))
From str method of Test: a is 123, b is 456

__str__ 메쏘드가 정의되지 않았다면, print(t) (또는 print(str(t)) )는 대신 __repr__ 의 결과를 사용할 것입니다

__repr__ 메쏘드가 정의되어 있지 않으면 기본값이 사용됩니다. 이것은 ..와 거의 같습니다.

def __repr__(self):
    return "<%s instance at %s>" % (self.__class__.__name__, id(self))

>>> class Test:
...     def __repr__(self):
...         return "Test()"
...     def __str__(self):
...         return "member of Test"
... 
>>> t = Test()
>>> t
Test()
>>> print(t)
member of Test

__str__ 메쏘드는 그것을 인쇄 할 때 일어나는 일이며, __repr__ 메쏘드는 repr() 함수를 사용할 때 (또는 대화식 프롬프트에서 볼 때 repr() 일어나는 일입니다. 이것이 가장 Pythonic 한 방법이 아니라면, 나는 아직도 배우기 때문에 사과드립니다, 그러나 그것은 효과적입니다.

__str__ 메쏘드가 주어지지 않으면, 파이썬은 __repr__ 의 결과를 대신 출력합니다. __str__ 을 정의하지만 __repr__ 을 정의하지 않으면 Python은 위에 보이는 것을 __repr__ 사용하지만 인쇄에는 여전히 __str__ 을 사용합니다.







object