Рассмотрим этот класс:
class foo(object):
pass
Строковое представление по умолчанию выглядит примерно так:
>>> str(foo)
"<class '__main__.foo'>"
Как я могу сделать это отображение пользовательской строки?
Реализуйте __str__()
или __repr__()
в метаклассе класса.
class MC(type):
def __repr__(self):
return 'Wahaha!'
class C(object):
__metaclass__ = MC
print C
Используйте, __str__
если вы имеете в виду читаемую строку, используйте __repr__
для однозначных представлений.
_representation
в тело класса, так иreturn self._representation
в__repr__()
метод метакласса.__repr__
для представленияC
. Альтернативой наличию_representation
члена является создание фабрики метаклассов, которая производит метакласс с правильным__repr__
(это может быть хорошо, если вы часто используете это).источник
instances
класса, а не для самого класса.Если вам нужно выбрать между
__repr__
или__str__
перейти к первому, как по умолчанию__str__
вызовы реализации,__repr__
когда он не был определен.Пользовательский пример Vector3:
В этом примере
repr
снова возвращает строку, которая может быть непосредственно использована / выполнена, тогдаstr
как более полезна в качестве отладочного вывода.источник
__repr__
vs__str__
верна, это не дает ответа на реальный вопрос, касающийся объектов класса, а не экземпляров.Одобренный ответ Игнасио Васкеса-Абрамса совершенно прав. Это, однако, из поколения Python 2. Обновление для текущего Python 3 будет:
Если вам нужен код, который работает как на Python 2, так и на Python 3, то шесть модулей помогут вам:
Наконец, если у вас есть один класс, для которого вы хотите иметь пользовательское статическое repr, вышеописанный подход на основе классов работает отлично. Но если у вас их несколько, вам нужно сгенерировать метакласс, аналогичный
MC
каждому, и это может стать утомительным. В этом случае продвижение метапрограммирования на шаг вперед и создание фабрики метаклассов делает вещи немного чище:печатает:
Метапрограммирование - это не то, что вам обычно нужно каждый день, но когда вам это нужно, оно действительно попадает в точку!
источник
Просто добавлю ко всем прекрасным ответам мою версию с оформлением:
стандартный вывод:
Недостатки:
C
без суперкласса (нетclass C:
)C
экземпляры будут экземплярами некоторого странного происхождения, так что, вероятно, будет хорошей идеей добавить и__repr__
для экземпляров.источник