Python - 面向对象编程 - 魔术方法(双下划线方法)
什么是魔术方法
在Python中,所有以 __ 双下划线包起来的方法,都统称为 Magic Method 魔术方法,也叫双下划线方法
有哪些重要的魔术方法?
__new__
https://www.cnblogs.com/poloyy/p/15236309.html
__init__
https://www.cnblogs.com/poloyy/p/15189562.html
__str__
https://www.cnblogs.com/poloyy/p/15202541.html
__repr__
https://www.cnblogs.com/poloyy/p/15250973.html
__del__
https://www.cnblogs.com/poloyy/p/15192098.html
__call__
https://www.cnblogs.com/poloyy/p/15253366.html
其他比较常见的魔术方法
__len__
len() 调用对象会返回 __len__ 方法 return 的值,必须返回 integer
class A:
def __len__(self):
return 4 a = A()
print(len(a)) # 输出结果
4
__hash__
hash() 调用对象会返回 __hash__ 方法 return 的值,必须返回 integer
# __hash__
class A:
def __hash__(self):
return 123456 a = A()
print(hash(a)) # 输出结果
123456
__eq__
定义等于号的行为:x == y
class A:
def __init__(self):
self.a = 1
self.b = 2 def __eq__(self, obj):
print("call eq method.")
if self.a == obj.a and self.b == obj.b:
return True a = A()
b = A()
# 实例对象有 == 行为时,自动调用 __eq__() 方法
print(a == b) # 输出结果
call eq method.
True
比较操作符的魔术方法
| __lt__(self, other) | 定义小于号的行为:x < y 调用 x.__lt__(y) |
| __le__(self, other) | 定义小于等于号的行为:x <= y 调用 x.__le__(y) |
| __ne__(self, other) | 定义不等号的行为:x != y 调用 x.__ne__(y) |
| __gt__(self, other) | 定义大于号的行为:x > y 调用 x.__gt__(y) |
| __ge__(self, other) | 定义大于等于号的行为:x >= y 调用 x.__ge__(y) |
魔术方法大全
|
魔法方法
|
含义
|
| 基本的魔法方法 | |
| __new__(cls[, ...]) | 1. __new__ 是在一个对象实例化的时候所调用的第一个方法 |
| __init__(self[, ...]) | 构造器,当一个实例被创建的时候调用的初始化方法 |
| __del__(self) | 析构器,当一个实例被销毁的时候调用的方法 |
| __call__(self[, args...]) | 允许一个类的实例像函数一样被调用:x(a, b) 调用 x.__call__(a, b) |
| __len__(self) | 定义当被 len() 调用时的行为 |
| __repr__(self) | 定义当被 repr() 调用时的行为 |
| __str__(self) | 定义当被 str() 调用时的行为 |
| __bytes__(self) | 定义当被 bytes() 调用时的行为 |
| __hash__(self) | 定义当被 hash() 调用时的行为 |
| __bool__(self) | 定义当被 bool() 调用时的行为,应该返回 True 或 False |
| __format__(self, format_spec) | 定义当被 format() 调用时的行为 |
| 有关属性 | |
| __getattr__(self, name) | 定义当用户试图获取一个不存在的属性时的行为 |
| __getattribute__(self, name) | 定义当该类的属性被访问时的行为 |
| __setattr__(self, name, value) | 定义当一个属性被设置时的行为 |
| __delattr__(self, name) | 定义当一个属性被删除时的行为 |
| __dir__(self) | 定义当 dir() 被调用时的行为 |
| __get__(self, instance, owner) | 定义当描述符的值被取得时的行为 |
| __set__(self, instance, value) | 定义当描述符的值被改变时的行为 |
| __delete__(self, instance) | 定义当描述符的值被删除时的行为 |
| 比较操作符 | |
| __lt__(self, other) | 定义小于号的行为:x < y 调用 x.__lt__(y) |
| __le__(self, other) | 定义小于等于号的行为:x <= y 调用 x.__le__(y) |
| __eq__(self, other) | 定义等于号的行为:x == y 调用 x.__eq__(y) |
| __ne__(self, other) | 定义不等号的行为:x != y 调用 x.__ne__(y) |
| __gt__(self, other) | 定义大于号的行为:x > y 调用 x.__gt__(y) |
| __ge__(self, other) | 定义大于等于号的行为:x >= y 调用 x.__ge__(y) |
| 算数运算符 | |
| __add__(self, other) | 定义加法的行为:+ |
| __sub__(self, other) | 定义减法的行为:- |
| __mul__(self, other) | 定义乘法的行为:* |
| __truediv__(self, other) | 定义真除法的行为:/ |
| __floordiv__(self, other) | 定义整数除法的行为:// |
| __mod__(self, other) | 定义取模算法的行为:% |
| __divmod__(self, other) | 定义当被 divmod() 调用时的行为 |
| __pow__(self, other[, modulo]) | 定义当被 power() 调用或 ** 运算时的行为 |
| __lshift__(self, other) | 定义按位左移位的行为:<< |
| __rshift__(self, other) | 定义按位右移位的行为:>> |
| __and__(self, other) | 定义按位与操作的行为:& |
| __xor__(self, other) | 定义按位异或操作的行为:^ |
| __or__(self, other) | 定义按位或操作的行为:| |
| 反运算 | |
| __radd__(self, other) | (与上方相同,当左操作数不支持相应的操作时被调用) |
| __rsub__(self, other) | (与上方相同,当左操作数不支持相应的操作时被调用) |
| __rmul__(self, other) | (与上方相同,当左操作数不支持相应的操作时被调用) |
| __rtruediv__(self, other) | (与上方相同,当左操作数不支持相应的操作时被调用) |
| __rfloordiv__(self, other) | (与上方相同,当左操作数不支持相应的操作时被调用) |
| __rmod__(self, other) | (与上方相同,当左操作数不支持相应的操作时被调用) |
| __rdivmod__(self, other) | (与上方相同,当左操作数不支持相应的操作时被调用) |
| __rpow__(self, other) | (与上方相同,当左操作数不支持相应的操作时被调用) |
| __rlshift__(self, other) | (与上方相同,当左操作数不支持相应的操作时被调用) |
| __rrshift__(self, other) | (与上方相同,当左操作数不支持相应的操作时被调用) |
| __rand__(self, other) | (与上方相同,当左操作数不支持相应的操作时被调用) |
| __rxor__(self, other) | (与上方相同,当左操作数不支持相应的操作时被调用) |
| __ror__(self, other) | (与上方相同,当左操作数不支持相应的操作时被调用) |
| 增量赋值运算 | |
| __iadd__(self, other) | 定义赋值加法的行为:+= |
| __isub__(self, other) | 定义赋值减法的行为:-= |
| __imul__(self, other) | 定义赋值乘法的行为:*= |
| __itruediv__(self, other) | 定义赋值真除法的行为:/= |
| __ifloordiv__(self, other) | 定义赋值整数除法的行为://= |
| __imod__(self, other) | 定义赋值取模算法的行为:%= |
| __ipow__(self, other[, modulo]) | 定义赋值幂运算的行为:**= |
| __ilshift__(self, other) | 定义赋值按位左移位的行为:<<= |
| __irshift__(self, other) | 定义赋值按位右移位的行为:>>= |
| __iand__(self, other) | 定义赋值按位与操作的行为:&= |
| __ixor__(self, other) | 定义赋值按位异或操作的行为:^= |
| __ior__(self, other) | 定义赋值按位或操作的行为:|= |
| 一元操作符 | |
| __pos__(self) | 定义正号的行为:+x |
| __neg__(self) | 定义负号的行为:-x |
| __abs__(self) | 定义当被 abs() 调用时的行为 |
| __invert__(self) | 定义按位求反的行为:~x |
| 类型转换 | |
| __complex__(self) | 定义当被 complex() 调用时的行为(需要返回恰当的值) |
| __int__(self) | 定义当被 int() 调用时的行为(需要返回恰当的值) |
| __float__(self) | 定义当被 float() 调用时的行为(需要返回恰当的值) |
| __round__(self[, n]) | 定义当被 round() 调用时的行为(需要返回恰当的值) |
| __index__(self) | 1. 当对象是被应用在切片表达式中时,实现整形强制转换 2. 如果你定义了一个可能在切片时用到的定制的数值型,你应该定义 __index__ 3. 如果 __index__ 被定义,则 __int__ 也需要被定义,且返回相同的值 |
| 上下文管理(with 语句) | |
| __enter__(self) | 1. 定义当使用 with 语句时的初始化行为 2. __enter__ 的返回值被 with 语句的目标或者 as 后的名字绑定 |
| __exit__(self, exc_type, exc_value, traceback) | 1. 定义当一个代码块被执行或者终止后上下文管理器应该做什么 2. 一般被用来处理异常,清除工作或者做一些代码块执行完毕之后的日常工作 |
| 容器类型 | |
| __len__(self) | 定义当被 len() 调用时的行为(返回容器中元素的个数) |
| __getitem__(self, key) | 定义获取容器中指定元素的行为,相当于 self[key] |
| __setitem__(self, key, value) | 定义设置容器中指定元素的行为,相当于 self[key] = value |
| __delitem__(self, key) | 定义删除容器中指定元素的行为,相当于 del self[key] |
| __iter__(self) | 定义当迭代容器中的元素的行为 |
| __reversed__(self) | 定义当被 reversed() 调用时的行为 |
| __contains__(self, item) | 定义当使用成员测试运算符(in 或 not in)时的行为 |
回头再用到哪些再详解吧
Python - 面向对象编程 - 魔术方法(双下划线方法)的更多相关文章
- Python中的魔术(双下划线'__xxx__')方法详解
介绍 在Python中,所有以“__”双下划线包起来的方法,都统称为“Magic Method”,中文称『魔术方法』,例如类的初始化方法 __init__ ,Python中所有的魔术方法均在官方文档中 ...
- python面向对象双下划线方法与元类
目录 双下划线方法(__) 元类简介 产生类的两种表现形式 元类的基本使用 元类进阶操作 __new__方法 双下划线方法(__) 面向对象中的双下方法也有一些人称之为是魔法方法,有些双下方法不需要刻 ...
- python_面向对象——双下划线方法
1.__str__和__repe__ class Person(object): def __init__(self,name,age): self.name = name self.age = ag ...
- python类中的双下划线方法
__getitem__,__setitem__和__delitem__ 实现了对象属性的字典化操作. class Person: def __init__(self, name, age, hobby ...
- python类中方法加单下划线、双下划线、前后双下滑线的区别
首先看一段代码: class Foo(): def __init__(self): print "__init__ method" def public_method(self): ...
- Python中单下划线与双下划线用法总结
看mentor的脚本时,遇到self._item.callspec.getparam('')语句,理解起来比较困难,找到一篇文章,记录的比较详细,特别记录一下,以备复习. 附链接地址:http://w ...
- 【编程开发】Python隐藏属性——使用双下划线标识私有属性,外部不可直接访问
from:https://zhuanlan.zhihu.com/p/30553607 小编在最初使用上Python之后,就一发不可收拾,人生苦短.我用Python,不光是因为其优雅简洁, ...
- Python笔记_第三篇_面向对象_4.单下划线和双下划线
说道这里我们需要稍微暂停一下.前面我们说到了类是作为一个对象存放容器.这个容器里面有属性和方法.最好的理解类的方式就是把类想想成一个容器. 然后构造了一个析构函数和构造函数,然后又对object和se ...
- python 面向对象三 访问权限 下划线 双下划线
一.双下划线 如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线__,在Python中,实例的变量名如果以__开头,就变成了一个私有变量(private),只有内部可以访问,外部不能访问. ...
随机推荐
- Spring WebFlow 远程代码执行漏洞(CVE-2017-4971)
影响版本 Spring WebFlow 2.4.0 - 2.4.4 访问id为1的酒店http:/ :8080/hotels/1,点击预订按钮"Book Hotel",填写相关信息 ...
- Linux的链接(入门)
Linux的链接分为两种:硬链接和软链接 硬链接:如果B是A的硬链接,那么B和A指向同一个文件,但是删除A并不会影响B->允许一个文件有多个路径 软链接:类似Windows下的快捷方式,删除原文 ...
- noip模拟33[进阶啦啦啦]
noip模拟33 solutions 不知道该咋说,这场考试其实是我这三四场以来最最最最最顺心的一场了 为啥呢?因为我这回思考有很多结果,得到了脑袋的回复 就是你想了半个小时就有了一点点头绪,那感觉就 ...
- 网络编程之TCP客户端开发和TCP服务端开发
开发 TCP 客户端程序开发步骤 创建客户端套接字对象 和服务端套接字建立连接 发送数据 接收数据 关闭客户端套接字 import socket if __name__ == '__main__': ...
- 剑指 Offer 32 - II. 从上到下打印二叉树 II
剑指 Offer 32 - II. 从上到下打印二叉树 II 从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行. 例如: 给定二叉树: [3,9,20,null,null,1 ...
- 阿里内部资料:Android开发核心知识笔记共2100页,58万字,完整版开放下载
作为一个3-5年的Android工程师,我们经常会遇到这些瓶颈: 1.技术视野窄长期在小型软件公司,外包公司工作,技术视野被限制的太厉害 2.薪资提升难初中级Android岗位薪资上升空间有限,基本上 ...
- Spark的两种核心Shuffle详解
在 MapReduce 框架中, Shuffle 阶段是连接 Map 与 Reduce 之间的桥梁, Map 阶段通过 Shuffle 过程将数据输出到 Reduce 阶段中.由于 Shuffle 涉 ...
- mapboxgl 互联网地图纠偏插件(三)
先说结论,结论当然是:大功告成,喜大普奔.看效果图: 好了,接下来说一下过程 先回顾一下这个系列的第一篇和第二篇 第一篇是直接改的 mapboxgl 源码,在源码里面对瓦片的位置进行纠偏,遇到的问题是 ...
- python3+telnetlib实现简单自动测试
1 telnetlib介绍 1.1 简介 官方介绍文档:telnetlib -- Telnet 客户端 - Python 3.9.6 文档 telnetlib 模块提供一个实现Telnet协议的类 T ...
- Java Lambda 表达式源码分析
基本概念 Lambda 表达式 函数式接口 方法引用 深入实现原理 字节码 为什么不使用匿名内部类? invokedynamic 总结 参考链接 GitHub 项目 Lambda 表达式是什么?JVM ...