ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2021-09-06 11:58:52  阅读:196  来源: 互联网

标签:__ ... 调用 Python self repr str


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,self,repr,str
来源: https://blog.csdn.net/be5yond/article/details/120129892

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有