Python Special Methods - 特殊方法
特殊方法
特殊方法的存在是为了给 Python 解释器调用的,通常自己并不需要直接调用它们。
也就是说不应该使用 my_object.__len__() 这种写法,而应该使用 len(my_object)调用。
在执行 len(my_object) 的时候,如果 my_object 是一个自定义类的对象,那么 Python 解释器会
去调用所属类其中的 __len__ 方法。 然而,如果my_object是 Python 内置的类型,如list、str、bytearray 等,
那么 Python 解释器 CPython 会抄个近路,__len__ 方法实际上会直接返回 PyVarObject 里的 ob_size 属性。
PyVarObject 是表示内存中长度可变的内置对象的 C 语言结构体。直接读取这个值比调用一个方法要快很多。
通常特殊方法的调用是隐式的,比如 for i in x: 这个语句,背后其实调用的是 iter(x) 函数,
而这个函数的背后则是 x.__iter__() 方法。当然前提是这个方法在 x 中被实现了。 通常代码无需直接使用特殊方法。一个例外是 __init__ 方法,当代码里需要在子类中 __init__ 方法中调用超类的构造器(__init__),
如, super(BaseCls, self).__init__(args)。 通过内置的函数(例如 len、 iter、 str,等等)来使用特殊方法是最好的选择。这些内置函数不仅会调用特殊方法,通常它们的速度更快。
特殊方法一览表
| 类别 | 方法名 |
| 字符串 / 字节序列表示形式 | __repr__、 __str__、 __format__、 __bytes__ |
| 数值转换 | __abs__、 __bool__、 __complex__、 __int__、 __float__、 __hash__、 __index__ |
| 集合模拟 | __len__、 __getitem__、 __setitem__、 __delitem__、 __contains__ |
| 迭代枚举 | __iter__、 __reversed__、 __next__ |
| 可调用 | __call__ |
| 上下文管理 | __enter__、 __exit__ |
| 创建和销毁实例 | __new__、 __init__、 __del__ |
| 属性管理 | __getattr__、 __getattribute__、 __setattr__、 __delattr__、 __dir__ |
| 属性描述符 | __get__、 __set__、 __delete__ |
| 跟类相关的服务 | __prepare__、 __instancecheck__、 __subclasscheck__ |
| 一元运算符 | __neg__ -、 __pos__ +、 __abs__ abs() |
| 众多比较运算符 | __lt__ <、 __le__ <=、 __eq__ ==、 __ne__ !=、 __gt__ >、 __ge__ >= |
| 算术运算符 |
__add__ +、 __sub__ -、 __mul__ *、 __truediv__ /、 __floordiv__ //、 __mod__ %、 __divmod__ divmod()、 __pow__ ** 或pow()、 __round__ round() |
| 反向算术运算符 | __radd__、 __rsub__、 __rmul__、 __rtruediv__、 __rfloordiv__、 __rmod__、 __rdivmod__、 __rpow__ |
| 增量赋值算术运算符 | __iadd__、 __isub__、 __imul__、 __itruediv__、 __ifloordiv__、 __imod__、 __ipow__ |
| 位运算符 | __invert__ ~、 __lshift__ <<、 __rshift__ >>、 __and__ &、 __or__ |、 __xor__ ^ |
| 反向位运算符 | __rlshift__、 __rrshift__、 __rand__、 __rxor__、 __ror__ |
| 增量赋值位运算符 | __ilshift__、 __irshift__、 __iand__、 __ixor__、 __ior__ |
Python Special Methods - 特殊方法的更多相关文章
- Python中类的特殊方法详解
本文和大家分享的主要是python语言中类的特殊方法相关用法,希望对大家有帮助. 构造序列 1._len_(self) 2._getitem_(self,key) 3._setitem_(self,k ...
- python 面向对象、特殊方法与多范式、对象的属性及与其他语言的差异
1.python 面向对象 文章内容摘自:http://www.cnblogs.com/vamei/archive/2012/06/02/2532018.html 1.__init__() 创建对 ...
- Python 类的魔术方法
Python中类的魔术方法 在Python中以两个下划线开头的方法,__init__.__str__.__doc__.__new__等,被称为"魔术方法"(Magic method ...
- Python学习笔记之面向对象编程(三)Python类的魔术方法
python类中有一些方法前后都有两个下划线,这类函数统称为魔术方法.这些方法有特殊的用途,有的不需要我们自己定义,有的则通过一些简单的定义可以实现比较神奇的功能 我主要把它们分为三个部分,下文也是分 ...
- 关于python中的特殊方法
研究了几个小时,大概对python中的特殊方法一知半解,现在写写自己的理解,以及记录一些找到的资源.待自己有比较深入理解的时候,再来更新 https://docs.python.org/3/refer ...
- Python Flask API实现方法-测试开发【提测平台】阶段小结(一)
微信搜索[大奇测试开],关注这个坚持分享测试开发干货的家伙. 本篇主要是对之前几次分享的阶阶段的总结,温故而知新,况且虽然看起来是一个小模块简单的增删改查操作,但其实涉及的内容点是非常的密集的,是非常 ...
- python 类属性与方法
Python 类属性与方法 标签(空格分隔): Python Python的访问限制 Python支持面向对象,其对属性的权限控制通过属性名来实现,如果一个属性有双下划线开头(__),该属性就无法被外 ...
- Python执行系统命令的方法 os.system(),os.popen(),commands
os.popen():用python执行shell的命令,并且返回了结果,括号中是写shell命令 Python执行系统命令的方法: https://my.oschina.net/renwofei42 ...
- python 调用 shell 命令方法
python调用shell命令方法 1.os.system(cmd) 缺点:不能获取返回值 2.os.popen(cmd) 要得到命令的输出内容,只需再调用下read()或readlines()等 ...
随机推荐
- Java类成员之构造器
构造器含义: 是指使得JVM在构造对象的时候,帮助进行成员变量的初始化的方法. 构造器(构造方法)格式: 1.对于构造方法而言,方法的名称是固定的,和类名相同. 2.对于构造方法而言,它没有返回值,而 ...
- UGUI源码之Selectable
Selectable是Button.InputField.Toggle.ScrollBar.Slider.Dropdown的基类. Selectable的继承的类与接口如下: public class ...
- sql if else 语句
IF ELSE 语句IF ELSE 是最基本的编程语句结构之一几乎每一种编程语言都支持这种结构而它在用于对从数据库返回的数据进行检查是非常有用的TRANSACT-SQL 使用IF ELSE的例子如下语 ...
- 2、Automapper安装及配置
一. 安装 我们安装是在 vs 中使用Nuget的方式进行安装 不过安装时需注意一件事情就是,版本问题,我示例使用的是.net framework 4.5.2,所以我安装AutoMapper的版本是7 ...
- Excel-条件格式
今天运用了一下条件格式中的自建规则进行公式筛选, 设置格式那里一定要将$P$8修改为$P8 然后双击修改后的第一项进行单元格的自动填充
- SSAS Tabular表格模型实现动态权限管理
最近忽然对SSAS产生了浓厚兴趣,我看博客园上也米有写关于SSAS 2016下表格模型实现动态权限管理的文章,最近鼓捣了一下微软的样例,鼓捣好了,把过程中遇到的一些问题写出来,抛砖引玉,也算给自己一个 ...
- Pandas中merge和join的区别
可以说merge包含了join的操作,merge支持通过列或索引连表,而join只支持通过索引连表,只是简化了merge的索引连表的参数 示例 定义一个left的DataFrame left=pd.D ...
- Xhemj的Minecraft皮肤信息
xhemj Minecraft Profile UUID:086e0354-fbb6-446b-83d4-60bdf449ad4e UUID:086e0354fbb6446b83d460bdf449a ...
- nuxt.js学习初探
项目目标 把我个人博客的前端界面部分使用nuxt框架进行服务端渲染 nuxt介绍 nuxt可以把spa根据路由将单页面分割成多页面,比起vue的ssr渲染要更容易使用 nuxt的使用 项目创建 npx ...
- Java基础知识之设计模式--单例模式
Java设计模式--单例模式 声明:本文根据慕课网汤小洋老师的精品课程整理来的:慕课网 什么是设计模式(Design Pattern)? 设计模式是一套被反复使用,多数人知晓的,经过分类编目的,代码设 ...