У меня есть куча классов, которые я использую в качестве одноименных/enums/dict ключей, например. г. например:определение repr() классов (а не экземпляров)
class Side(object): pass
class Left(Side): pass
class Right(Side): pass
def show_state(distribution):
print "left is", distribution[Left]
print "right is", distribution[Right]
distribution = { Left: 3, Right: 7 }
show_state(distribution)
Это прекрасно работает для меня. Но у меня небольшая проблема с выходом отладки, которую я иногда делаю. Обычно я использую только print
для этого как в print distribution
в функции show_state()
. Я хотел бы иметь выход как:
{ Left: 3, Right: 7 }
Но когда я делаю это с этими классами они приведены как нечто вроде этого:
{<class '__main__.Right'>: 7, <class '__main__.Left'>: 3}
Я попытался переопределить __repr__()
метод моих классов для этого, но когда я это делаю, это влияет только на экземпляров моих классов (которые я никогда не создавал). Я пытался использовать @classmethod
и @staticmethod
, но ничего не получилось.
Я предполагаю, что я печатаю это Left
и поэтому экземпляр <type 'type'>
, так что я бы переопределить __repr__()
метод type
класса, который неизменен, к сожалению.
Есть ли какой-либо другой трюк, который я мог бы использовать, чтобы print distribution
распечатывал то, что я хочу?
Btw, согласно документации, метод __repr__()
должен возвращать то, что парсер Python снова превратится в равный объект; это определенно не так с выходом, как <class '__main__.Right'>
, но определенно будет иметь дело с выходом, например Right
.
И я думаю, вы могли бы сэкономить несколько байт, определяя '__slots__' –
Конечно, но я имел в виду 2-й вариант, где вы создаете экземпляры. –
Ну, конечно, да. * Facepalm *. –