programing

Python의 목록에서 __str_에 대해 혼동함

yellowcard 2023. 9. 7. 21:37
반응형

Python의 목록에서 __str_에 대해 혼동함

에서 온 것으로 있습니다.__str__toString의 Python 버전과 유사합니다(Python이 오래된 언어라는 것을 알고 있지만).

, 는 를 했습니다 했습니다 를 는 __str__방법은 다음과 같습니다.

class Node:

    def __init__(self, id):
        self.id = id
        self.neighbours = []
        self.distance = 0


    def __str__(self):
        return str(self.id)

그런 다음 몇 가지 인스턴스를 만듭니다.

uno = Node(1)    
due = Node(2)    
tri = Node(3)    
qua = Node(4)

이러한 개체 중 하나를 인쇄하려고 할 때 예상되는 동작은 연관된 값이 인쇄된다는 것입니다.이런 경우도 있습니다.

print uno

수확량

1

하지만 내가 다음을 할 때:

uno.neighbours.append([[due, 4], [tri, 5]])

그리고 나서.

print uno.neighbours

알겠습니다.

[[[<__main__.Node instance at 0x00000000023A6C48>, 4], [<__main__.Node instance at 0x00000000023A6D08>, 5]]]

내가 기대했던 곳

[[2, 4], [3, 5]]

제가 무엇을 빠뜨리고 있나요?그 외에 내가 하고 있는 움츠러들 만한 일은? :)

하는 두 . 즉, 은 를 하는 을 로 을 를 로 은 str()그리고.repr()를 인쇄할 는 . 할 .str() 용도를 ; 가 가 str()자체의 , 록해를을해나해ftr나e록,ef를tt해list.__str__()repr()개개의 항목에 대해.

도 도 .__repr__()요.

__repr__ = __str__

수업이 끝날 때쯤이면 몸이 묘기를 부릴 겁니다

자바에 비해 Python의 무한한 우위 때문에, Python은 하나가 아니라 개의 String 작업을 가지고 있습니다.

는 ㅇ__str__ 하나는, 는 __repr__

__str__사람이 읽을 수 있는 문자열을 반환합니다.__repr__내부 표현을 반환합니다.

__repr__할 수 .repr(obj) 백틱을 `obj`.

다른 는 Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ, __repr__.

출력의 사람이 읽을 수 있는 버전을 "Object"(Object)": 예:

class Pet(object):

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

    def getName(self):
        return self.name

    def getSpecies(self):
        return self.species

    def Norm(self):
        return "%s is a %s" % (self.name, self.species)

if __name__=='__main__':
    a = Pet("jax", "human")
    print a 

돌아온다

<__main__.Pet object at 0x029E2F90>

코드가 "str"인 경우 다른 것을 반환합니다.

class Pet(object):

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

    def getName(self):
        return self.name

    def getSpecies(self):
        return self.species

    def __str__(self):
        return "%s is a %s" % (self.name, self.species)

if __name__=='__main__':
    a = Pet("jax", "human")
    print a 

반환:

jax is a human

질문에 대한 답변

다른 답변에서 지적된 바와 같이 PEP 3140에서 읽을 수 있듯이,strlist 항목에 각에한출출한에__repr__는 할 수. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

이 ㅇㅇ을 실행한다면__repr__ 더 인 것을 수 있을 이 기대했던 일치하지 입니다., 인 을 입니다 입니다 인 을 . 하지만 올바르게 구현된다면, 기대했던 것과는 다릅니다.

적절한 구현

빠르고 잘못된 해결책은 별칭입니다.__repr____str__.

__repr__해서는안다다안o로로 설정하면 안 됩니다.__str__ 무조건적으로__repr__표현을 만들어야 합니다.표현은 동일한 값을 가진 개체를 다시 만드는 사용될 수 있는 유효한 Python 처럼 보여야 합니다.이 경우에는 차라리 이 사건이Node(2)2.

의 의 적절한 이행__repr__개체를 다시 만들 수 있습니다.예에서는이과은른한도야다는다야e,n이ncoerts는,dtes과한은른 등neighours그리고.distance.

불완전한 예:

class Node:

    def __init__(self, id, neighbours=[], distance=0):
        self.id = id
        self.neighbours = neighbours
        self.distance = distance


    def __str__(self):
        return str(self.id)


    def __repr__(self):
        return "Node(id={0.id}, neighbours={0.neighbours!r}, distance={0.distance})".format(self)
        # in an elaborate implementation, members that have the default
        # value could be left out, but this would hide some information


uno = Node(1)    
due = Node(2)    
tri = Node(3)    
qua = Node(4)

print uno
print str(uno)
print repr(uno)

uno.neighbours.append([[due, 4], [tri, 5]])

print uno
print uno.neighbours
print repr(uno)

참고:print repr(uno) Δ Δ Δ Δ Δ Δ ΔΔ Δ Δ Δ Δ Δ Δ Δ Δ__eq__그리고.__ne__아니면__cmp__개체를 다시 만들고 동일성을 확인할 수 있습니다.

, __str__용을 합니다.repr그들의 내용물이 아니라str. 그래서 당신은 사용할 수 있습니다.__repr__에 대신에__str__으로 ID 하는 을 를 으로 하는 을 를 .

__str__개체에 문자열 표현이 필요한 경우에만 호출됩니다.

를 들어 str(uno),print "%s" % uno아니면print uno

하지만 또 다른 마법의 방법이 있습니다.__repr__이것은 물체의 표현입니다.개체를 문자열로 명시적으로 변환하지 않으면 표현이 사용됩니다.

.uno.neighbors.append([[str(due),4],[str(tri),5]])당신이 기대하는 대로 해줄 겁니다

클래스의 경우, 그리고 클래스 내의 일부 값과 동일한 글로벌 변수를 설정하는 경우, 글로벌 변수가 저장하는 것은 실제로 해당 값이 저장된 메모리 위치에 대한 참조입니다.

출력물에서 볼 수 있는 것은 이를 보여줍니다.

str 메서드와 인쇄가 작동하는 방식 때문에 사용한 초기 전역 변수에서 값을 보고 인쇄를 문제없이 사용할 수 있는 경우 목록에서는 이 작업을 수행할 수 없습니다. 왜냐하면 목록 내의 요소에 저장된 것은 값의 메모리 위치를 참조하는 것일 뿐이기 때문입니다. 별칭에서 읽습니다.더 알고 싶다면요

또한 목록을 사용하고 별칭이 무엇이고 무엇이 아닌지 추적할 수 없을 때 별칭 목록에서 변경하면 원래 목록 요소의 값이 변경되는 것을 발견할 수 있습니다. 왜냐하면 목록 요소를 목록 또는 목록 내의 요소와 동일하게 설정하면새 목록은 메모리 위치에 대한 참조만 저장합니다(실제로 해당 새 변수에 특정한 새 메모리 공간을 만들지는 않습니다).여기에 딥카피가 도움이 됩니다!

활자로 찍어내다self.id.__str__()당신에게 도움이 되지는 않겠지만요

당신의.__str__방법은 프로그램이 개발될 때 그리드나 구조 표현을 출력하고 싶다고 말할 때 더 유용할 것입니다.

print self._grid.__str__()

def __str__(self):
    """
    Return a string representation of the grid for debugging.
    """
    grid_str = ""
    for row in range(self._rows):
        grid_str += str( self._grid[row] )
        grid_str += '\n'
    return grid_str

언급URL : https://stackoverflow.com/questions/12448175/confused-about-str-on-list-in-python

반응형