Самый распространенный способ сделать это в python - это определить a __format__
метод , чтобы вы могли использовать спецификаторы формата так же, как "{:05.3f}"
может форматировать числа с плавающей запятой.
Если вам нужно только 2 представления, одно из которых должно быть более удобным для пользователя, а другое - более наглядным, вы можете обойтись без простого определения __str__
и __repr__
, для контекста используется __repr__
при отображении значений в интерактивном терминале или при вызове repr
или использовании "{0!r}".format
.
Вот пример кода для начала работы:
class Demo:
def __init__(self, a,b):
self.a = a
self.b = b
def __repr__(self):
# should usually have a repr method to show code representation
return "Demo({0.a!r}, {0.b!r})".format(self)
def __str__(self):
# str should give user friendly representation, default format
return "Demo()"
def __format__(self, spec):
# format for more specific details
if spec == "": # usually empty spec should be equivalent to str.
return str(self)
elif spec == "d":
return "(a:{0.a}, b:{0.b})".format(self)
else:
raise NotImplementedError("unsupported spec: {!r}".format(spec))
x = Demo("A", "B")
print("str: {0}, repr: {0!r}, spec='d': {0:d}".format(x))
print("WILL THROW ERROR: {0:OTHER_SPEC}".format(x))
Вы можете сделать любой формат c вы sh, то, что будет передано в спецификатор, будет передано методу __format__
в виде строки.