2010-09-11 2 views
50

Я действительно не понимаю, где __str__ и __repr__ используется в Python. Я имею в виду, я получаю, что __str__ возвращает строковое представление объекта. Но зачем мне это нужно? В каком сценарии использования? Кроме того, я читал об использовании __repr__Какова цель __str__ и __repr__?

Но я не понимаю, где бы я их использовал?

+8

http://stackoverflow.com/questions/1436703/difference-between-str-and-repr-in-python – miku

+4

Для тех, кто наступающем от Ruby, ТЛ; ССБ: '' __str__' = to_s 'и' __repr__' = 'проверка'. – Ajedi32

ответ

59

__repr__

Вызывается встроенной функцией repr() и строковых преобразований (реверс кавычки), чтобы вычислить «официальное» строковое представление объекта. Если это вообще возможно, это должно выглядеть как действительное выражение Python, которое может быть использовано для воссоздания объекта с тем же значением (с учетом соответствующей среды).

__str__

Вызывается встроенной функцией str() и заявление для печати, чтобы вычислить «неофициальное» строковое представление объекта.

Используйте __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__ 
+1

Спасибо! Это именно то, что я искал! – Daniel

+0

что 'return self._repr()' делает, когда я запускаю код и пытаюсь его понять, __repr __() принимает ровно один аргумент. – shining

+0

Итак, могу ли я использовать '__repr__' вместо' __str__' django? –

10

Кузнечик, в случае сомнений go to the mountain и read the Ancient Texts. В них вы найдете, что __repr __() должен:

Если это вообще возможно, это должно выглядеть как действительное выражение Python, которое может быть использовано для воссоздания объекта с тем же значением.

+3

-1, так как это даже не пытается ответить на фактический вопрос, что и есть варианты использования. –

+3

@Scott: Вы правы. Но опять-таки * фактический вопрос * не показал абсолютно никакой попытки попасть в первичные документы в первую очередь. Одно дело задавать вопрос, который показывает, что вы попытались ответить на него сами, но все еще немного смущены каким-то его аспектом, а совсем другое - задать такой вопрос. Просто набрав строку темы в качестве нового вопроса, вы увидите, что 5 из 6 лучших SO-потоков ответили на его вопрос, но его не беспокоило. Я не совсем дал ему ответ, но я был сильно искушен. –

+1

Фактически он сказал, что читал о '__repr__', официальные документы не отвечают на вопрос о том, почему вы его используете, и только потому, что на вопрос ответили в другом месте, это не повод для этого не так же, как и на SO (так часто, как не Googling вернет вас сюда!) Если вы не думаете, что вопрос стоит ответить, тогда вы можете просто не отвечать на него, хотя в этом случае я согласен, что он покрыт очень хорошо уже на SO, и поэтому ссылка на дубликаты будет подходящим ответом. –

43

Одно место, где вы их используете, очень много в интерактивной сессии. Если вы печатаете объект, то его метод __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__ для возврата того же значения (конечно, для встроенных типов).

4

Построение и предыдущие ответы и еще несколько примеров. При правильном использовании разница между str и repr понятна.Короче говоря, repr должен возвращать строку, которая может быть скопирована для восстановления точного состояния объекта, тогда как str полезна для результатов отладки logging и observing. Вот несколько примеров, чтобы увидеть различные результаты для некоторых известных библиотек.

Datetime

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 снова непосредственно расходным.

Пользовательские Vector3 Пример

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

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

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

В этом примере repr снова возвращается строка, которая может быть непосредственно потребляться/выполняется, в то время как str является более полезным в качестве выходных данных отладки.

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

Одна вещь, чтобы иметь в виду, что если str не определена, но repr, str будет автоматически вызывать repr. Таким образом, это всегда хорошо, по крайней мере, определить repr

0

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 
Смежные вопросы