str () 및 () 보고서

17298 단어 python
대부분의 경우,python 초보자와 경험이 풍부한 베테랑들은 신뢰할 수 있는 오래된 print() 문장 디버깅 코드, 특히 엿보기 대상의 내용을 사용하려고 시도한다.우리가 주피터 노트북과 같은 상호작용 환경에서 일할 때 이 점은 특히 정확하다.하나의 예는 추가 작업 후에 목록의 내용을 볼 수 있습니다.원소를 목록에 추가하고 print() 그것을 사용해 보았을 때 어떤 일이 일어날지 아주 간단한 예를 들자.
lst = list()
    for x in range(3):
    lst.append(x)
    print(lst)
>>[0]
>>[0, 1]
>>[0, 1, 2]
우리는 우리가 목록 대상을 인쇄할 때, 목록 대상은 사용자가 이해할 수 있는 출력을 받는다는 것을 보았다.이제 비슷한 일을 다시 시도해 봅시다.이번에는 사용자 정의 대상을 인쇄해 보겠습니다.먼저 간단한 클래스 "Bike"를 정의합니다.
class Bike:
    def __init__(self,brand,size):
        self.brand = brand
        self.size = size

object_bike = Bike("Fixie","Medium")
print(object_bike)

>> <__main__.Bike object at 0x7fda39054e50>
우리는 목록 대상을 인쇄할 때 사용자가 list 대상의 출력을 이해할 수 있음을 보았다.이제 비슷한 일을 다시 시도해 봅시다.이번에는 사용자 정의 대상을 인쇄해 보겠습니다.먼저 간단한 클래스 "Bike"를 정의합니다.
여기에서, 우리가 자신의 대상을 정의하고 문장을 인쇄하려고 시도할 때.우리는 상당히 심오한 수출을 얻었다<__main__.Bike object at 0x7fda39054e50>.현재 이 출력은 최종 사용자나 개발자에게도 쓸모가 없다.
이것이 바로 __str____repr__의 줄거리다.이것들은 모두 특수한 기능으로 우리의 대상을 더욱 쉽게 이해할 수 있도록 다시 쓸 수 있다.자바를 사용하는 개발자도 비슷한 것toString()을 사용하여 같은 목표를 실현했다.
만약python 문서를 읽는다면, 우리는 다음과 같은 신비로운 해석을 얻을 수 있다
__str__()__repr__()는 대상에 대해 문자열을 표시할 수 있도록 합니다.지금 더욱 곤혹스러운 것은 왜 두 가지 다른 방법으로 같은 일을 실현할 수 있느냐는 것이다.이 두 가지 기능은 모두 물체의 문자열 해석을 제공하기 위한 것이다.하지만 다른 시청자들에게는__str__ 기능의 목표 사용자는 대상을 이해할 수 있는 비공식적인 정의를 원하는 사용자이다.__repr__는 대상을 더욱 정식으로 정의하는 데 쓰인다.우리가 이전의 자전거 수업에서 그것을 실현할 때, 이것은 더욱 의미가 있을 것이다.
class Bike:
    def __init__(self,brand,size):
        self.brand = brand
        self.size = size

    def __str__(self):
        return f" ----Bike object----\n     brand:{self.brand} \n     size:{self.size} "

object_bike = Bike("Fixie","Medium")
print(object_bike)

>>  ---- Bike object ----
        brand: Fixie 
        size: Medium 
현재, 우리가 대상의 실례에서 print () 를 사용할 때, 우리는 대상이 무엇인지를 설명하는 데 더욱 유용한 출력을 얻을 수 있다.이제 이 대상의 __repr__ 실현을 살펴봅시다.
class Bike:
    def __init__(self,brand,size):
        self.brand = brand
        self.size = size

    def __str__(self):
        return f" ----Bike object----\n     brand:{self.brand} \n     size:{self.size} "

    def __repr__(self):
        return f"Bike({self.brand!r},{self.size!r})"

object_bike = Bike("Fixie","Medium")
repr(object_bike)

>> "Bike('Fixie','Medium')"
주의: "세부 사항 실현"부분에서 왜 f 문자열에서 "! r"을 사용하는지 토론할 것입니다.
현재 우리는 repr(object)를 사용하고 있으며, 우리는 서로 다른 출력을 얻었다.이것은 개발자를 대상으로 한 것으로, 예를 들어 대상을 어떻게 초기화해야 하는지에 대한 공식적인 정의를 많이 제공했다.사실상, 우리는 리퍼의 출력을 사용하여 대상을 다시 만들 수 있다.또한 repr 출력은 문자열임을 나타내는 인용부호를 가지고 있음을 주의하십시오.우리는 다음 예시에서 왜 리퍼가 문자열 출력을 하는지 이해할 것이다.

class Bike:
    def __init__(self,brand,size):
        self.brand = brand
        self.size = size

    def __str__(self):
        return f" ----Bike object----\n     brand:{self.brand} \n     size:{self.size} "

    def __repr__(self):
        return f"Bike({self.brand!r},{self.size!r})"

object_bike = Bike("Fixie","Medium")
repr(object_bike)
# notice that the output is encased as a string
>> "Bike('Fixie','Medium')"

new_object = eval(repr(object_bike))
new_object.brand
>> "Fixie"
new_object.size
>> "Medium"

여기서 우리가 repr를 사용할 때 개발자는 대상이 어떻게 만들어졌는지 이해할 수 있고 eval() 함수를 사용하여 대상을 다시 만들 수 있다.주의해야 할 점은 __str__를 사용하여 같은 출력을 만들면 같은 값의 문자열을 만들지 않기 때문에 eval와 함께 사용할 수 없다는 것이다.

class Bike:
    def __init__(self,brand,size):
        self.brand = brand
        self.size = size

    def __str__(self):
        return f"Bike({self.brand},{self.size})"

    def __repr__(self):
        return f"Bike({self.brand!r},{self.size!r})"

y = Bike("Fixie","Medium")
str(y)
# notice its not a string
>> Bike(Fixie,Medium)
repr(y)
# a string representation 
>> "Bike('Fixie','Medium')"

현재, 우리가 사용한 repr 을 자세히 살펴보면,python에서 f-strings와 함께 사용하면, 출력을 하나의 !r 로 포장해서 문자열로 표시할 것이다. 예를 들어, 우리가 위의 예시에서 사용하지 않았다면 '', 우리의 출력은

repr(y)
>> "Bike(Fixie,Medium)"
{% endhighlight %}

instead we want

{% highlight python %}

repr(y)
>> "Bike('Fixie','Medium')"

One thing to add is that repr() need not be always a strict definition of a function. We can have whatever output we want. But its a general convention to have __repr__to have a formal object definition while __str__to be the understandable output to an object.


심어진 디테일

  • 대상에 print()를 사용할 때.대상은 우선 그것을 찾아서 !r 실현하고, 없으면 __str__ 출력을 되돌려줍니다.
  • 우리가 __repr____str__의 출력을 더 자세히 보면 __repr__의 출력은 문자열 형식이 될 것이며''로 묶여 있음을 알 수 있다.이것은 문자열을 매개 변수로 필요로 하는 함수 __repr__ 에서 __repr__ 의 출력을 사용할 수 있게 한다.이것이 바로 우리가 eval() 사용한 __repr__ f 문자열을 되돌릴 때, 대상이 정확한 문자열 표시 형식을 가지도록 자동으로 전의 서열 문자 출력을 추가하는 이유입니다.
  • 권장 클래스
  • 에서 실현!r
  • 우리가 만든 모든 종류에 대해 공식적인 정의를 내릴 수 없는 것도 충분히 받아들일 수 있다.
  • 이것들은 내가 연구__repr____str__에서 얻은 재미있는 관찰 결과들이다.만약 내가 심각한 잘못을 저질렀다면, 반드시 나에게 메일을 보내야 한다.

    참고 문헌

  • PythonDocs
  • stack overflow
  • Dan Barders Amazing blog
  • Real Python
  • UCD Python 프로그래밍 클래스
  • 좋은 웹페이지 즐겨찾기