[python] __str__ 및 __repr__의 목적은 무엇입니까?

나는 파이썬에서 어디에 __str__있고 __repr__사용 되는지 정말로 이해하지 못합니다 . 즉 __str__, 객체의 문자열 표현 을 반환합니다. 하지만 왜 그게 필요할까요? 어떤 사용 사례 시나리오에서? 또한 사용에 대해 읽었습니다.__repr__

하지만 내가 이해하지 못하는 것은 어디에서 사용할 것인가?



답변

__repr__

repr()내장 함수와 문자열 변환 (역 따옴표)에 의해 호출되어 객체의 “공식적인”문자열 표현을 계산합니다. 가능하다면 이것은 같은 값 (적절한 환경이 주어 졌을 때)을 가진 객체를 다시 만드는 데 사용할 수있는 유효한 파이썬 표현식처럼 보일 것입니다.

__str__

str()내장 함수와 print 문에 의해 호출되어 객체의 “비공식”문자열 표현을 계산합니다.

사용 __str__당신은 클래스가, 당신은 문자열의 일부로이 개체를 사용할 때마다 당신은 유익한 / 비공식 출력을 할 것입니다 경우. 예를 들어 __str__Django 모델에 대한 메소드를 정의 할 수 있으며 이는 Django 관리 인터페이스에서 렌더링됩니다. 대신에 <Model object>사람의 이름과 성, 이벤트의 이름과 날짜 등이 표시됩니다.


__repr__그리고 __str__비슷합니다. 사실 때로는 동일합니다 ( 표준 라이브러리의 BaseSet클래스의 예 sets.py).

def __repr__(self):
    """Return string representation of a set.

    This looks like 'Set([<list of elements>])'.
    """
    return self._repr()

# __str__ is the same as __repr__
__str__ = __repr__


답변

둘 다 많이 사용하는 곳은 대화 형 세션입니다. 개체를 인쇄하면 해당 __str__메서드가 호출되고 개체 만 사용하면 해당 메서드 __repr__가 표시됩니다.

>>> from decimal import Decimal
>>> a = Decimal(1.25)
>>> print(a)
1.25                  <---- this is from __str__
>>> a
Decimal('1.25')       <---- this is from __repr__

__str__(가) 반면, 사람이 읽을 수있는 최대한으로하기위한 것입니다 __repr__개체를 다시 사용할 수있는 뭔가하는 것을 목표로한다 종종이 경우로,이 생성 된 방법을 정확하게하지 않습니다 있지만.

두 가지 모두 __str____repr__동일한 값을 반환하는 것도 드문 일이 아닙니다 (확실히 내장 유형의 경우).


답변

메뚜기, 경우에 의심 산으로 이동고대 교과서를 읽을 . 그것들에서 __repr __ ()은 다음과 같아야합니다 :

가능하다면 동일한 값을 가진 객체를 다시 만드는 데 사용할 수있는 유효한 Python 표현식처럼 보일 것입니다.


답변

이전 답변을 작성하고 더 많은 예를 보여줍니다. 적절하게 사용하는 경우의 차이 str와는 repr분명하다. 즉 repr반면, 복사 – 붙여 넣은 객체의 정확한 상태를 재 구축 할 수 있습니다 문자열을 반환해야 str하는 데 유용 logging하고 observing디버깅 결과. 다음은 일부 알려진 라이브러리의 다른 출력을 확인하는 몇 가지 예입니다.

날짜 시간

print repr(datetime.now())    #datetime.datetime(2017, 12, 12, 18, 49, 27, 134411)
print str(datetime.now())     #2017-12-12 18:49:27.134452

str로그 파일로 인쇄 하는 것이 좋습니다. repr직접 실행하거나 파일에 명령으로 덤프하려는 경우 용도 를 변경할 수 있습니다.

x = datetime.datetime(2017, 12, 12, 18, 49, 27, 134411)

Numpy

print repr(np.array([1,2,3,4,5])) #array([1, 2, 3, 4, 5])
print str(np.array([1,2,3,4,5]))  #[1 2 3 4 5]

Numpy에서는 repr다시 직접 소모품입니다.

Custom Vector3 예제

class Vector3(object):
    def __init__(self, args):
        self.x = args[0]
        self.y = args[1]
        self.z = args[2]

    def __str__(self):
        return "x: {0}, y: {1}, z: {2}".format(self.x, self.y, self.z)

    def __repr__(self):
        return "Vector3([{0},{1},{2}])".format(self.x, self.y, self.z)

이 예제에서는 repr직접 사용 / 실행할 수있는 문자열을 다시 반환하지만 str디버그 출력으로 더 유용합니다.

v = Vector3([1,2,3])
print str(v)     #x: 1, y: 2, z: 3
print repr(v)    #Vector3([1,2,3])

한 가지는 경우, 명심해야 할 str정의되지 않고 repr, str자동으로 호출합니다 repr. 따라서 최소한 정의하는 것이 항상 좋습니다.repr


답변

__str__함수 없는 클래스를 만들 수 있습니다.

class Employee:

    def __init__(self, first, last, pay):
        self.first = first
        self.last = last
        self.pay = pay

emp1 = Employee('Ivan', 'Smith', 90000)

print(emp1)

이 클래스 인스턴스를 인쇄하면 다음 emp1과 같은 결과를 얻을 수 있습니다.

<__main__.Employee object at 0x7ff6fc0a0e48>

이것은별로 도움이되지 않으며, 우리가 그것을 표시하기 위해 사용하는 경우 (예 : html에서) 인쇄하고자하는 것이 아닙니다.

이제 동일한 클래스이지만 __str__기능이 있습니다.

class Employee:

    def __init__(self, first, last, pay):
        self.first = first
        self.last = last
        self.pay = pay

    def __str__(self):
        return(f"The employee {self.first} {self.last} earns {self.pay}.")
        # you can edit this and use any attributes of the class

emp2 = Employee('John', 'Williams', 90000)

print(emp2)

이제 객체가 있음을 인쇄하는 대신 __str__함수 반환으로 지정한 것을 얻습니다 .

The employee John Williams earns 90000


답변

str비공식적이고 읽기 쉬운 형식이지만 repr공식적인 객체 표현을 제공합니다.

class Complex:
    # Constructor
    def __init__(self, real, imag):
        self.real = real
        self.imag = imag

    # "official" string representation of an object
    def __repr__(self):
        return 'Rational(%s, %s)' % (self.real, self.imag)

    # "informal" string representation of an object (readable)
    def __str__(self):
        return '%s + i%s' % (self.real, self.imag)

    t = Complex(10, 20)

    print (t)     # this is usual way we print the object
    print (str(t))  # this is str representation of object 
    print (repr(t))  # this is repr representation of object   

Answers :

Rational(10, 20) # usual representation
10 + i20      # str representation
Rational(10, 20)  # repr representation


답변

strrepr 은 모두 표현하는 방법입니다. 수업을 작성할 때 사용할 수 있습니다.

class Fraction:
def __init__(self, n, d):
    self.n = n
    self.d = d
def __repr__(self):
    return "{}/{}".format(self.n, self.d)

예를 들어 인스턴스를 인쇄하면 결과가 반환됩니다.

print(Fraction(1, 2))

결과

1/2

동안

class Fraction:
def __init__(self, n, d):
    self.n = n
    self.d = d
def __str__(self):
    return "{}/{}".format(self.n, self.d)
print(Fraction(1, 2))

또한 결과

1/2

그러나 둘 다 작성하면 파이썬이 사용하는 것은 무엇입니까?

class Fraction:
def __init__(self, n, d):
    self.n = n
    self.d = d
def __str__(self):
    return "str"
def __repr__(self):
    return "repr"

print(Fraction(None, None))

결과

str

따라서 파이썬은 실제로 둘 다 작성 될 때 repr 메서드가 아닌 str 메서드를 사용합니다 .