Одобренный ответ Игнасио Васкеса-Абрамса совершенно прав. Это, однако, из поколения Python 2. Обновление для текущего Python 3 будет:
class MC(type):
def __repr__(self):
return 'Wahaha!'
class C(object, metaclass=MC):
pass
print(C)
Если вам нужен код, который запускается как на Python 2, так и на Python 3, то модуль six включает в себя:
from __future__ import print_function
from six import with_metaclass
class MC(type):
def __repr__(self):
return 'Wahaha!'
class C(with_metaclass(MC)):
pass
print(C)
Наконец, если у вас есть один класс, для которого вы хотите иметь пользовательское статическое repr, описанный выше подход на основе классов отлично работает. Но если у вас их несколько, вам придется сгенерировать метакласс, подобный MC
для каждого, и это может стать утомительным. В этом случае продвижение метапрограммирования на шаг вперед и создание фабрики метаклассов делает вещи немного чище:
from __future__ import print_function
from six import with_metaclass
def custom_class_repr(name):
"""
Factory that returns custom metaclass with a class ``__repr__`` that
returns ``name``.
"""
return type('whatever', (type,), {'__repr__': lambda self: name})
class C(with_metaclass(custom_class_repr('Wahaha!'))): pass
class D(with_metaclass(custom_class_repr('Booyah!'))): pass
class E(with_metaclass(custom_class_repr('Gotcha!'))): pass
print(C, D, E)
печать:
Wahaha! Booyah! Gotcha!
Метапрограммирование - это не то, что вам обычно нужно каждый день & mdash; но когда вам это нужно, оно действительно срабатывает!