Python教程

Python 中的魔术方法(五)类的展示方法, __str__ 和 __repr__

本文主要是介绍Python 中的魔术方法(五)类的展示方法, __str__ 和 __repr__,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

1. __str__ 和 __repr__

Python的内置函数 repr() 能够把对象用字符串的形式表达出来,方便我们辨认。这就是“字符串表示形式”。

根据 Python 文档中定义

  • __str__ :通过 str(object) 以及内置函数 format() 和 print() 调用以生成一个对象的“非正式”或格式良好的字符串表示。返回值必须是字符串对象

  • __repr__:是由 repr() 内置函数调用,用来输出一个对象的“官方”字符串表示。返回值必须是字符串对象,此方法通常被用于调试。内置类型所定义的默认实现会调用 object.__repr__()。

如果__repr__已定义,而__str__ 未定义,则对象调用__str__ =__repr__。

str() 和 之间的主要区别 repr() 是目标受众。 repr() 旨在生成大部分机器可读的输出(在许多情况下,它甚至可能是有效的 Python 代码),而 str() 旨在生成人类可读的输出。

自定义__str__函数,实现更直观的信息打印

In [1]: MARKS = ['♣', '♦', '♥', '♠']
   ...: SUITS = ['Clubs', 'Diamonds', 'Hearts', 'Spades']
   ...: RANKS = ['2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A']
   ...:
   ...: class Card:
   ...:     def __init__(self, suit, rank):
   ...:         self.suit = suit
   ...:         self.rank = rank
   ...:
   ...:     def __str__(self):
   ...:         mark = MARKS[SUITS.index(self.suit)]
   ...:         return f'{mark}{self.rank}'
   ...:

In [2]: heartsJ = Card('Hearts', 'J')

# 解释器调用 repr 打印
In [3]: heartsJ  
Out[3]: <__main__.Card at 0x122e9633908>

# print函数调用 str
In [4]: print(heartsJ)
♥J

2. 其他方法

2.1 __unicode__(self)

定义了 unicode() 在实例上调用的行为 。

unicode() 和 str() 类似,但它返回的是一个 unicode 字符串。注意:如果类的实例而只定义了__unicode__,  而调用使用 str() ,则它将无法工作。

2.2 __format__(self, formatstr)

定义在字符串格式化过程中使用类的实例时的行为。

例如, "Hello, {0:abc}!".format(a) 会导致调用 a.__format__("abc") 。这对于定义您可能希望提供特殊格式选项的数字或字符串类型非常有用。

2.3 __hash__(self)

定义了当 hash() 在实例上调用的行为 。

它必须返回一个整数,其结果用于字典中的快速键比较。请注意,这通常也需要实施 __eq__ 。遵循以下规则: a == b 意味着 hash(a) == hash(b)。

2.4 __nonzero__(self)

定义了当 bool() 在实例上调用的行为 。应该返回 True or False。

2.5 __dir__(self)

定义了当 dir() 在实例上调用的行为 。

此方法应返回用户的属性列表。一般情况下没有必要实现 __dir__ ,除非重新定义了 __getattr__ 或 __getattribute__ 或以其他方式动态生成属性 。

2.6 __sizeof__(self)

定义了当 sys.getsizeof() 实例上调用的行为 。应该以字节为单位返回对象的大小。这对于在 C 扩展中实现的 Python 类通常更有用。

这篇关于Python 中的魔术方法(五)类的展示方法, __str__ 和 __repr__的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!