Python 魔术方法

发布于 2024-10-14 08:59:49 字数 4759 浏览 10 评论 0

首先明确一点,特殊方法的存在是为了被 Python 解释器调用的,你自己并不需要调用它们。也就是说没有 my_object.__len__() 这种写法,而应该使用 len(my_object) 在执行 len(my_object) 的时
候,如果 my_object 是一个自定义类的对象,那么 Python 会自己去调用其中由你实现的 __len__ 方法。

通过内置的函数(例如 leniterstr ,等等) 来使用特殊方法是最好的选择。这些内置函数不仅会调用特殊方法,通常还提供额外的好处,而且对于内置的类来说,它们的速度更快

假设定义了一个类 Magic ,那么定义了魔术方法后会有如下的效果

魔术方法在 data model 中有较为详细和完整的介绍

跟运算符无关的特殊方法

字符串 字节序列

  • __repr__ : 定义返回对象的格式,调用这个对象时返回的格式(一般面向的时程序员),在 REPL 中输入这个对象时输出属于 __repr__ ,被 repr 或者 print 函数调用
  • __str__ : 定时输出的格式,类似 print(object) 的输出格式(一般面向的时用户),如果 __str__ 没有定义但是 __repr__ 有定义时 print 会输出 __repr__ 的值,被 str 函数调用
    • __repr____str__ 的区别 Difference between str and repr
    • __repr__ 注重准确性
    • __str__ 注重可读性
    • 容器的 __str__ 包括了 __repr__
      • 如果 __repr__ 定义了但是 __str__ 没有定义,就会 __str__=__repr__
  • __format__ :
  • __bytes__ :

数值转换

  • __abs__ : 获取对象的绝对值,通过 abs 函数调用
  • __bool__ : 返回对象的 bool 类型,通过 bool 函数调用,可以用于 if while and or not 的组合运算.默认情况下,我们自己定义的类的实例总被认为是真的(如果 __bool____len__ 没有定义),如果只定义了 __bool__ 没有定义 __len__ 则调用 bool(obj) 的时候会调用 __len__ ,为 0 则返回 False,反之返回 True
  • __complex__ :
  • __int__ :
  • __float__ :
  • __hash__ :
  • __index__ :

集合模拟

  • __len__ : 获取序列的长度,被 len 函数调用.如果对象是一个内置类型, len() 方法会非常快,背后的原因是 CPython 会直接从一个 C 结构体里读取对象的长度,完全不会调用任何方法.len 不是一个普通方法,len 之所以不是一个普通方法,是为了让 Python 自带的数据结构可以走后门
  • __getitem__ : 使序列的 [] 方法生效,可以对其进行索引,切片,变成可迭代对象用 for 进行迭代,用 in 方法判断元素是否在序列中( __contains__ 方法应该更好些)
  • __setitem__ :
  • __delitem__ :
  • __contains__ :

迭代枚举

  • __iter__ :
  • __reversed__ :
  • __next__ :

可调用模拟

  • __call__ :

上下文管理

  • __enter__ :
  • __exit__ :

实例创建和销毁

  • __new__ :
  • __init__ :
  • __del__ :

属性管理

  • __getattr__ :
  • __getattribute__ :
  • __setattr__ :
  • __delattr__ :
  • __dir__ :

属性描述符

  • __get__ :
  • __set__ :
  • __delete__ :

类相关的服务

跟运算符相关的特殊方法

一元运算符

  • __neg__ : -
  • __pos__ : +
  • __abs__ : abs()

算术运算符

  • __add__ : + 通过 + 中缀运算符调用,返回新对象,原对象不变, add
  • __sub__ : - subtract
  • __mul__ : * 通过 * 中缀运算符调用,返回新对象,原对象不变, multiply
  • __div__ : / divide , 现在一般用 __truediv__ 代表
  • __truediv__ : / divide
  • __floordiv__ : //
  • __mod__ : % 取余数
  • __divmod__ : divmod()
  • __pow__ : **pow()
  • __round__ : round()
  • __iadd__ : 自增的加, += ,对于可变对象相当于在可变对象调用 append 或者 extend , 这个时候的对象是原来的对象, id(Object) 的值是不变的 如果没有实现这个功能,则会调用 __add__ ,但是此时的对象 id 已经变成了别的 id 了,不可变对象一般不会实现这个功能,不可变对象使用 += 的时候会调用 __add__ 功能,生成一个新对象
  • __imul__ : 与 __iadd__ 类似

比较运算符

  • __lt__ : <
  • __le__ : <=
  • __eq__ : ==
  • __ne__ : !=
  • __gt__ : >
  • __ge__ : >=

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

嘿嘿嘿

暂无简介

0 文章
0 评论
22 人气
更多

推荐作者

qq_z5gHLI

文章 0 评论 0

圈圈圆圆圈圈

文章 0 评论 0

alipaysp_h2Vbo4sv6k

文章 0 评论 0

初见你

文章 0 评论 0

清风无影

文章 0 评论 0

云胡

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文