Как я могу сделать так, чтобы print показывал что-то пользовательское (например, что-то, что включает в себя a значение атрибута)? То есть, как я могу определить, как экземпляры класса будут отображаться при печати (их строковое представление)?
>>> classTest: ... def__repr__(self): ... return"Test()" ... def__str__(self): ... return"member of Test" ... >>> t = Test() >>> t Test() >>> print(t) member of Test
__str__ Метод - это то, что вызывается при его печати, а __repr__ метод - это то, что происходит при использовании repr() функции (или когда вы просматриваете ее с помощью интерактивного приглашения).
Если не задан __str__ метод, Python вместо этого напечатает результат __repr__ . Если вы определяете, __str__ но не __repr__, Python будет использовать то, что вы видите выше, как __repr__, но все равно будет использовать __str__ для печати.
Для многих типов эта функция пытается вернуть строку, которая при передаче в eval() выдает объект с тем же значением, в противном случае представление представляет собой строку, заключенную в угловые скобки, которая содержит имя типа объекта вместе с дополнительной информацией, часто включающей имя и адрес объекта. Класс может управлять тем, что эта функция возвращает для своих экземпляров, определяя __repr__() метод.
Учитывая следующий тест класса:
classTest: def__init__(self, a, b): self.a = a self.b = b
def__str__(self): returnf"From str method of Test: a is {self.a}, b is {self.b}"
..в оболочке Python это будет действовать следующим образом:
>>> t = Test(123, 456) >>> t <Test a:123 b:456> >>> print(repr(t)) <Test a:123 b:456> >>> print(t) From str method of Test: a is123, b is456 >>> print(str(t)) From str method of Test: a is123, b is456
Если не определен __str__ метод, print(t) (или print(str(t))) вместо этого будет использоваться результат __repr__
Если не определен __repr__ метод, то используется метод по умолчанию, который примерно эквивалентен:
def__repr__(self): cls = self.__class__ returnf"<{cls.__module_}.{cls.__qualname__} object at {id(self)}>"
Ответ 3
Если вы находитесь в ситуации, подобной @Keith, вы могли бы попробовать:
print(a.__dict__)
Это противоречит тому, что я бы счел хорошим стилем, но если вы просто пытаетесь отлаживать, то он должен делать то, что вы хотите.
Ответ 4
Общий способ, который может быть применен к любому классу без специального форматирования, может быть выполнен следующим образом:
classElement: def__init__(self, name, symbol, number): self.name = name self.symbol = symbol self.number = number