[python] Python __str__ 및 목록

Java에서 List.toString ()을 호출하면 List 내의 각 객체에 대해 toString () 메서드가 자동으로 호출됩니다. 예를 들어, 내 목록에 o1, o2 및 o3 객체가 포함 된 경우 list.toString ()은 다음과 같습니다.

"[" + o1.toString() + ", " + o2.toString() + ", " + o3.toString() + "]"

Python에서 유사한 동작을 얻을 수있는 방법이 있습니까? 클래스에서 __str __ () 메서드를 구현했지만 다음을 사용하여 객체 목록을 인쇄 할 때 :

print 'my list is %s'%(list)

다음과 같이 보입니다.

[<__main__.cell instance at 0x2a955e95f0>, <__main__.cell instance at 0x2a955e9638>, <__main__.cell instance at 0x2a955e9680>]

파이썬이 목록 내의 각 요소 (또는 그 문제에 대한 dict)에 대해 자동으로 __str__을 호출하도록 할 수 있습니까?



답변

파이썬 목록에서 문자열을 호출하면 __repr__내부의 각 요소에 대한 메서드가 호출 됩니다. 일부 항목 __str____repr__동일합니다. 해당 동작을 원하면 다음을 수행하십시오.

def __str__(self):
    ...
def __repr__(self):
    return self.__str__()


답변

목록 이해 를 사용하여 각 항목이 str () ‘d 자동으로 새 목록을 생성 할 수 있습니다 .

print([str(item) for item in mylist])


답변

당신이 할 수있는 두 가지 쉬운 일은 map기능을 사용하거나 이해력을 사용하는 것입니다.

그러나 그것은 문자열이 아닌 문자열 목록을 얻습니다. 따라서 현을 함께 연결해야합니다.

s= ",".join( map( str, myList ) )

또는

s= ",".join( [ str(element) for element in myList ] )

그런 다음이 복합 문자열 객체를 인쇄 할 수 있습니다.

print 'my list is %s'%( s )


답변

해당 출력을 사용하려는 대상에 따라 __repr__더 적절할 수 있습니다.

import unittest

class A(object):
    def __init__(self, val):
        self.val = val

    def __repr__(self):
        return repr(self.val)

class Test(unittest.TestCase):
    def testMain(self):
        l = [A('a'), A('b')]
        self.assertEqual(repr(l), "['a', 'b']")

if __name__ == '__main__':
    unittest.main()


답변

나는 이것을하기 위해 목록 이해력을 사용하는 것에 대한 이전 답변에 동의하지만, 그것이 당신의 보트를 떠 다니는 것이면 함수 뒤에 숨길 수 있습니다.

def is_list(value):
    if type(value) in (list, tuple): return True
    return False

def list_str(value):
    if not is_list(value): return str(value)
    return [list_str(v) for v in value]

재미를 위해 list_str ()을 재귀 적으로 str () 목록에 포함 된 모든 것을 만들었습니다.


답변

이 같은?

a = [1, 2 ,3]
[str(x) for x in a]
# ['1', '2', '3']


답변

이것으로 충분합니다.

목록과 다른 컨테이너 클래스를 인쇄 할 때 포함 된 요소는 내부 객체 표현에 사용 __repr__되기 때문에를 사용하여 인쇄 __repr__됩니다. 전화하면 다음과 같이 help(object.__repr__)알려줍니다.

Help on wrapper_descriptor:

__repr__(self, /)
    Return repr(self).

그리고 호출 help(repr)하면 다음과 같이 출력됩니다.

Help on built-in function repr in module builtins:

repr(obj, /)
    Return the canonical string representation of the object.

    For many object types, including most builtins, eval(repr(obj)) == obj.

__str__객체에 대해 구현되고 그렇지 않은 경우 구현 __repr__되지 않은 경우 repr(obj)와 마찬가지로 기본 출력을 출력 하지 않습니다 print(obj).

따라서 유일한 방법은 __repr__클래스 를 구현 하는 것입니다. 이를 수행하는 한 가지 가능한 방법은 다음과 같습니다.

class C:
    def __str__(self):
        return str(f"{self.__class__.__name__} class str ")

C.__repr__=C.__str__
ci = C()


print(ci)       #C class str 
print(str(ci))  #C class str 
print(repr(ci)) #C class str