2016-11-15 4 views
-4

(Python 3.5.2)Как использовать __repr__ с несколькими аргументами?

Я определил __repr__ для одного из моих классов следующим образом:

class d(): 
    def __init__(self): 
     self._values = [] 
     return 
    def __pos__(self): 
     return self._values[0] 
    def __repr__(self, value): 
     self._values.append(value) 
     return 

Теперь я хочу

x = d() 
print(x,"a") 
print(+x) 

вернуть

a

, но вместо этого я получаю

TypeError: __repr__() missing 1 required positional argument: 'value'

Я пробовал несколько вариантов, таких как print(x),"a" не повезло.

+7

... '__repr __()' не принимает * любые * аргументы ... –

+0

И ваша функция должна возвращать строку, а не ничего , В init также нет никакого оператора возврата –

+0

(хотя технически законно возвращать ничего или, по крайней мере, 'None', из' __init __() ') –

ответ

1

Ваше использование __repr__ неправильным способом. __repr__ следует использовать для возврата представления вашего объекта в отпечатанном, отформатированном виде. В отличие от Python просто печатайте имя и адрес памяти вашего объекта. За документацией __repr__:

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

Я действительно не уверен, что вы пытаетесь достичь с использованием __repr__. Если вы хотите просто добавить элемент в self.values с помощью метода d, канавы магических методов и просто создать свои собственные:

class d(): 
    def __init__(self): 
     self._values = [] 

    def __pos__(self): 
     return self._values[0] 

    def append(self, value): # create your won function 
     self._values.append(value) 
2

Если вы хотите контролировать, как отображается экземпляр вашего класса, правильный путь сделать это, чтобы переопределить метод __format__. В общем, три способа, которые можно переопределить используются для:

  1. __repr__ - используется, когда необходимо объект, который будет отображаться в интерактивном интерпретаторе, как правило, помощь в отладке. Насколько это возможно, это должна быть строка, которая могла бы воссоздать объект, если он был оценен.
  2. __str__ - используется, когда объект передается в str или вызывается, когда print пытается отобразить ваш объект. Без другого определения он просто вызывает __repr__. Это строковое представление по умолчанию для экземпляра.
  3. __format__ - используется, когда ваш объект является аргументом str.format. Он получает в качестве дополнительного аргумента спецификацию формата (если есть), которая появляется после необязательного : в поле замены.

Вот простой пример класса для представления пар чисел.Символ, используемый для разделения чисел, можно настроить с помощью спецификации формата.

class Pair(): 
    def __init__(self, x, y): 
     self.x = x 
     self.y = y 

    def __format__(self, spec): 
     return "{}{}{}".format(self.x, spec, self.y) 

    def __str__(self): 
     return "{:/}".format(self) 

    def __repr__(self): 
     return "Pair({}, {})".format(self.x, self.y) 

Он может быть использован как не следует:

>>> x = Pair(1,2) 
>>> x # using __repr__ 
Pair(1, 2) 
>>> str(x) # using __str__, with a default separator of/
'1/2' 
>>> print(x) # uses __str__ implicitly 
1/2 
>>> "{}".format(x) # no separator specified 
'12' 
>>> "{:-}".format(x) # use - to separate the two numbers 
'1-2' 
Смежные вопросы