【Python】 魔法方法
魔法方法
这个名字真的很中二有没有 = =(或者说翻译气息太浓了,作为一个学外语的看到这种真是想吐槽的不行。。)
从形式上来说,在方法的名字前后个加上两条下划线的就是魔法方法了 。从功能上说,所有魔法方法都是python内建定义好的。不能自己定义一个__test__之类的。(当然你也可以让一个普通的方法叫这个,但它不是所谓魔法方法)。魔法方法的主要用法,就是在自定义类中进行覆盖重写。它的功能就是可以把原先调用的方式object.__method__()这样的形式转换成更加简单的形式。比如熟悉的__init__方法就是可以通过调用 类名()来实现。这么来更加直观
一共很多的魔法方法,比如:(下表引用自http://blog.csdn.net/koko66/article/details/42709279)
另外还需要补充一点,说是重写魔法方法,也不能乱重写。比如__int__方法,最终肯定还是要返回一个int值,否则也还是会报错。还有就是参数,比如__str__这个方法的意思就是调用str(对象)的行为,而str函数只接受一个参数,所以在__str__中不能写多个参数(如果参数有默认值到也是可以不报错,但是这样好像并没有什么意义,因为调用的时候还是要写对象.__str__(...)和一个普通方法没什么差别了)
| 
 魔法方法 
 | 
 含义 
 | 
| 
 基本的魔法方法 
 | 
|
| __new__(cls[, ...]) | 
1. __new__ 是在一个对象实例化的时候所调用的第一个方法 2. 它的第一个参数是这个类,其他的参数是用来直接传递给 __init__ 方法 3. __new__ 决定是否要使用该 __init__ 方法,因为 __new__ 可以调用其他类的构造方法或者直接返回别的实例对象来作为本类的实例,如果 __new__ 没有返回实例对象,则 __init__ 不会被调用 4. __new__ 主要是用于继承一个不可变的类型比如一个 tuple 或者 string  | 
| __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) | (与上方相同,当左操作数不支持相应的操作时被调用) | 
| __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) | 定义赋值按位或操作的行为:|= | 
| 一元操作符 | |
| __neg__(self) | 定义正号的行为:+x | 
| __pos__(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)时的行为 | 
这张表也不是很全,https://www.oschina.net/question/253614_115412 这篇文章应该是比较详细的了
【Python】 魔法方法的更多相关文章
- Python魔法方法总结及注意事项
		
1.何为魔法方法: Python中,一定要区分开函数和方法的含义: 1.函数:类外部定义的,跟类没有直接关系的:形式: def func(*argv): 2.方法:class内部定义的函数(对象的方法 ...
 - python魔法方法:__getattr__,__setattr__,__getattribute__
		
python魔法方法:__getattr__,__setattr__,__getattribute__ 难得有时间看看书....静下心来好好的看了看Python..其实他真的没有自己最开始想的那么简单 ...
 - python魔法方法大全
		
1.python魔法方法详解: python魔法方法是可以修改重载的,如果你的对象实现(重载)了这些方法中的某一个,那么这个方法就会在特殊的情况下被 Python 所调用,你可以定义自己想要的行为,而 ...
 - python 魔法方法补充(__setattr__,__getattr__,__getattribute__)
		
python 魔法方法补充 1 getattribute (print(ob.name) -- obj.func())当访问对象的属性或者是方法的时候触发 class F(object): def _ ...
 - 1. Python 魔法方法
		
Python 魔法方法 基础: 如果你想... 所以,你写... Python调用... 初始化一个实例 x = MyClass() x.__init__() 作为一个字符串的"官方&quo ...
 - with上下文管理  python魔法方法
		
with语法在Python里很常见, 主要的利好是使用代码更简洁. 常见的使用场景有: 1. 资源对象的获取与释放. 使用with可以简化try...finally ... 2. 在不修改函数代码的前 ...
 - python 魔法方法诠释
		
什么是Python魔法方法 什么是魔法方法呢?它们在面向对象的Python的处处皆是.它们是一些可以让你对类添加"魔法"的特殊方法. 它们经常是两个下划线包围来命名的(比如 ini ...
 - python 魔法方法
		
I am not a creator, I just a porter. Note: Everything is object in python. 对于Python来说一切都是对象,也就是函数的参数 ...
 - python 魔法方法之:__getitem__ __setitem__ __delitem__
		
h2 { color: #fff; background-color: #7CCD7C; padding: 3px; margin: 10px 0px } h3 { color: #fff; back ...
 - python 魔法方法(学习过程的笔记)
		
有小伙伴会问,什么是python的魔法方法,python的魔法方法有什么用呢, 它们在面向对象的Python的处处皆是.它们是一些可以让你对类添加"魔法"的特殊方法. 它们经常是两 ...
 
随机推荐
- 手把手教你在Windows环境下升级R
			
在Windows环境下,我们可以使用installr包自动将R升级到最新版本.并且可以安装软件.下面主要演示如何在Windows环境下升级R,并将旧版本安装的R包复制到更新版本的R. 1.加载inst ...
 - freemarker报错之十二
			
1.错误描述 六月 04, 2014 10:31:47 下午 freemarker.log.JDK14LoggerFactory$JDK14Logger error 严重: Template proc ...
 - Flex设置LinkButton的背景色
			
1.设计思路 由于Flex中没有设置LinkButton的背景色的属性,现在得从两个方面入手:第一,直接通过调用样式方法画出LinkButton的背景色:第二,设置LinkButton的背景图片 ...
 - TCP粘包、拆包及解决
			
TCP属于传输层的协议,传输层除了有TCP协议外还有UDP协议.那么UDP是否会发生粘包或拆包的现象呢?答案是不会.UDP是基于报文发送的,从UDP的帧结构可以看出,在UDP首部采用了16bit来指示 ...
 - 系统架构以及需要导入的jar包
			
架构: Servlet +JSP +JavaBean +JDBC 需要导入的jar包: MYSQL: 数据库驱动 C3PO连接池: (这个需要配置文件) C3PO DBUtils:特点:轻量级首选,增 ...
 - 最新数组方法(包括es6)
			
整理目前所用过的数组方法,学习了新增的es6方法. 1 arr.push() 从后面添加元素,返回值为添加完后的数组的长度 let arr = [1,2,3,4,5] console.log(arr. ...
 - EntityFramework Core 2.0 Explicitly Compiled Query(显式编译查询)
			
前言 EntityFramework Core 2.0引入了显式编译查询,在查询数据时预先编译好LINQ查询便于在请求数据时能够立即响应.显式编译查询提供了高可用场景,通过使用显式编译的查询可以提高查 ...
 - 一:学习Linux前准备工作
			
1:虚拟机,网站上有很多种类的虚拟机,找一款适合自己用的.我这里使用的是 Virtual Box 下载地址:https://www.virtualbox.org/ 安装虚拟机 一路 Next 就可以. ...
 - beautifulsoup库使用
			
介绍与安装 Beautiful Soup 是一个HTML/XML的解析器,主要的功能也是如何解析和提取 HTML/XML 数据.BeautifulSoup 用来解析 HTML 比较简单, API非常人 ...
 - CDQ分治嵌套模板:多维偏序问题
			
CDQ分治2 CDQ套CDQ:四维偏序问题 题目来源:COGS 2479 偏序 #define LEFT 0 #define RIGHT 1 struct Node{int a,b,c,d,bg;}; ...