__str__ 및 __repr__의 목적은 무엇입니까?
나는 파이썬에서 어디에 __str__
있고 __repr__
사용 되는지 정말로 이해하지 못합니다 . 즉 __str__
, 객체의 문자열 표현 을 반환합니다. 하지만 왜 그게 필요할까요? 어떤 사용 사례 시나리오에서? 또한 사용에 대해 읽었습니다.__repr__
하지만 내가 이해하지 못하는 것은 어디에서 사용할 것인가?
repr()
내장 함수와 문자열 변환 (역 따옴표)에 의해 호출되어 객체의 "공식적인"문자열 표현을 계산합니다. 가능하다면 이것은 같은 값 (적절한 환경이 주어진 경우)을 가진 객체를 다시 만드는 데 사용할 수있는 유효한 Python 표현식처럼 보일 것입니다.
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
비공식적이고 읽기 쉬운 형식이지만 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
__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
참고 URL : https://stackoverflow.com/questions/3691101/what-is-the-purpose-of-str-and-repr
'developer tip' 카테고리의 다른 글
IB Designables : 자동 레이아웃 상태 업데이트 실패 : 경로에서 Designables를로드하지 못했습니다 (null). (0) | 2020.10.26 |
---|---|
내 Eclipse 프로젝트에 팬텀 디버거 중단 점이있는 이유는 무엇입니까? (0) | 2020.10.26 |
Cmake가 Boost를 찾지 못함 (0) | 2020.10.26 |
@ URL.Action () 내에서 자바 스크립트 변수에 액세스하는 방법 (0) | 2020.10.26 |
jquery를 사용하여 라디오 그룹에서 값 가져 오기 (0) | 2020.10.26 |