特殊方法

特殊方法的存在是为了给 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 - 特殊方法的更多相关文章

  1. Python中类的特殊方法详解

    本文和大家分享的主要是python语言中类的特殊方法相关用法,希望对大家有帮助. 构造序列 1._len_(self) 2._getitem_(self,key) 3._setitem_(self,k ...

  2. python 面向对象、特殊方法与多范式、对象的属性及与其他语言的差异

    1.python 面向对象 文章内容摘自:http://www.cnblogs.com/vamei/archive/2012/06/02/2532018.html   1.__init__() 创建对 ...

  3. Python 类的魔术方法

    Python中类的魔术方法 在Python中以两个下划线开头的方法,__init__.__str__.__doc__.__new__等,被称为"魔术方法"(Magic method ...

  4. Python学习笔记之面向对象编程(三)Python类的魔术方法

    python类中有一些方法前后都有两个下划线,这类函数统称为魔术方法.这些方法有特殊的用途,有的不需要我们自己定义,有的则通过一些简单的定义可以实现比较神奇的功能 我主要把它们分为三个部分,下文也是分 ...

  5. 关于python中的特殊方法

    研究了几个小时,大概对python中的特殊方法一知半解,现在写写自己的理解,以及记录一些找到的资源.待自己有比较深入理解的时候,再来更新 https://docs.python.org/3/refer ...

  6. Python Flask API实现方法-测试开发【提测平台】阶段小结(一)

    微信搜索[大奇测试开],关注这个坚持分享测试开发干货的家伙. 本篇主要是对之前几次分享的阶阶段的总结,温故而知新,况且虽然看起来是一个小模块简单的增删改查操作,但其实涉及的内容点是非常的密集的,是非常 ...

  7. python 类属性与方法

    Python 类属性与方法 标签(空格分隔): Python Python的访问限制 Python支持面向对象,其对属性的权限控制通过属性名来实现,如果一个属性有双下划线开头(__),该属性就无法被外 ...

  8. Python执行系统命令的方法 os.system(),os.popen(),commands

    os.popen():用python执行shell的命令,并且返回了结果,括号中是写shell命令 Python执行系统命令的方法: https://my.oschina.net/renwofei42 ...

  9. python 调用 shell 命令方法

    python调用shell命令方法 1.os.system(cmd) 缺点:不能获取返回值 2.os.popen(cmd) 要得到命令的输出内容,只需再调用下read()或readlines()等   ...

随机推荐

  1. 固定表头的table

    在前端的开发过程中,表格时经常使用的一种展现形式.在我的开发过程中,当数据过多时,最常用的一种方式就是分页,但是有些地方还是需要滚动.通常的table 会随着滚动,导致表头看不见.一下是我找到的一种固 ...

  2. Java设计模式之三种工厂模式

    工厂模式实现了创建者和调用者的分离,实现了更好的解耦.   详细分类: 1) 简单工厂模式(静态工厂模式): 2) 工厂方法模式: 3) 抽象工厂模式 面向对象设计的基本原则: 1)       OC ...

  3. Redux 一步到位

    简介 Redux 是 JavaScript 状态容器,提供可预测化的状态管理 Redux 除了和 React 一起用外,还支持其它库( jquery ... ) 它体小精悍(只有2kB,包括依赖) 由 ...

  4. day6 云道页面 知识点梳理(1)

    关于块级元素.行内元素.行内块元素的梳理 (1)块级元素 特点:   a.可以设置宽高,行高,外边距和内边距   b.块级元素会独占一行    c.宽度默认是容器的100%    d.可以容纳内联元素 ...

  5. NameError:name ‘xrange’ is not defined

    原因: 在Python 3中,range()与xrange()合并为range( ). 我的python版本为python3.5. 解决办法: 将xrange( )函数全部换为range( ).

  6. Flash 上下文管理

    1.Local() 作用:为每个协程或线程创建一个独立的内存空间 储存格式: { 唯一标识: {'stack': []} } 代码 try: from greenlet import getcurre ...

  7. Codeforces Round #615 (Div. 3)

    A. Collecting Coins 题目链接:https://codeforces.com/contest/1294/problem/A 题意: 你有三个姐妹她们分别有 a , b , c枚硬币, ...

  8. 高通量计算框架HTCondor(二)——环境配置

    目录 1. 概述 2. 安装 3. 结果 4. 相关 1. 概述 HTCondor是开源跨平台的分布式计算框架,在其官网上直接提供了源代码和Windows.Linux以及MacOS的安装包.因为平台限 ...

  9. C#数字图像处理(十四)击中击不中变换 (Hit-miss)

    击中击不中变换定义 击中击不中变换(HMT)需要两个结构元素B1和B2,合成一个结构元素对B=(B1,B2) 一个用于探测图像内部,作为击中部分;另一个用于探测图像外部,作为击不中部分.显然,B1和B ...

  10. C++封装的基于WinSock2的TCP服务端、客户端

    无聊研究Winsock套接字编程,用原生的C语言接口写出来的代码看着难受,于是自己简单用C++封装一下,把思路过程理清,方便自己后续翻看和新手学习. 只写好了TCP通信服务端,有空把客户端流程也封装一 ...