Python魔法方法总结及注意事项
1、何为魔法方法:
Python中,一定要区分开函数和方法的含义;
1.函数:类外部定义的,跟类没有直接关系的;形式: def func(*argv):
2.方法:class内部定义的函数(对象的方法也可以认为是属性);分为两种:
① python自动产生的(魔法方法):一般形式为 __func__(),python会在对应的时机自动调用该函数;
② 人为自定义的方法:一般和普通函数没有区别,只是定义在了class中而已
3.方法与函数的区别:
方法可认为是函数的特殊情况;
① 方法定义在class内部
② 方法的第一个参数应为 cls(类方法) 或者 self(实例方法)
2、魔法方法汇总:
| 方法 | 描述 | 备注 |
| 1、基本方法 | ||
| __new__(cls[,*argv]) | 1. __new__ 是在一个对象实例化的时候所调用的第一个方法 2. 它的第一个参数是这个类,其他的参数是用来直接传递给 __init__ 方法 3. __new__ 决定是否要使用该 __init__ 方法,因为 __new__ 可以调用其他类的构造方法或者直接返回别的实例对象来作为本类的实例,如果 __new__ 没有返回实例对象,则 __init__ 不会被调用 4. __new__ 主要是用于继承一个不可变的类型比如一个 tuple 或者 string |
cls:代表一个类的名称 self:代表一个实例对象的名称 |
| __init__(self[,*argv]) | 构造器,当一个实例对象被定义时调用 | 类似于C++的构造函数 |
| __del__(self) | 析构器,当删除一个实例对象时调用 | 类似于C++的析构函数 |
| __call__(self[,*argv]) | 允许一个类像函数一样被调用 | class_x(a,b)实际调用的是class_x.__call__(a,b) |
| __len__(self) | 获得实例对象的长度 | 与调用函数 len(obj)一样的结果 |
| __repr__(self) | 将实例对象转化为字符串的形式 |
如 ls=[1,2,3], 则repr(ls)为 '[1,2,3]',与函数repr(obj)功能相同 |
| __str__(self) | 将实例对象转化为字符串的形式 |
与repr()的区别在于:str(obj)的字符串是打印出来让人看的,更加亲民,而repr(obj)是给解释器看的; 若 a = xxx(列表、字典、元祖或集合等) eval(repr(a)) == a 成立 eval(str(a)) == a 不一定成立 |
| __int__(self) | 定义当被 int() 调用时的行为 | |
| __float__(self) | 定义当被 float() 调用时的行为 | |
| __round__(self[, n]) | 当被round()调用时的行为 | round(digit[, n]) 将digit数字保留n位精度 |
| __hash__(self) | 定义能被 hash() 调用的行为 | |
| __bytes__(self) | 定义被 bytes() 调用的行为 | |
| __bool__(self) | 定义被 bool() 调用的行为 | 返回True(1) 或 False(0) |
| __format__(self, form) | 定义被 format()调用的行为 | |
| 2、运算符方法 | ||
| __add__(self, other) | 加法:+ | |
| __sub__(self, other) | 减法:- | |
| __mul__(self,other) | 乘法:* | |
| __truediv(self, other) | 除法:/ | 注意是 truediv |
| __floordiv(self, other) | 整数除法:// | floor()即为向下取整的意思 |
| __mod__(self, other) | 求余:% | |
| __pow__(self, other[, mod]) | 乘方:** |
pow(x,y[,z]), 若无Z,则为 return x**y 若有Z,则为 return x**y%z |
| __divmod__(self, other) | divmode() | 返回值为元祖 (商值,余数) |
| __lshift__(self, other) | 左移:<< | |
| __rshift__(self, other) | 右移:>> | |
| __and__(self, other) | 按位与:& | 注意以下均为按位操作,非逻辑操作 |
| __or__(self, other) | 按位或:| | |
| __xor__(self, other) | 按位异或:^ | |
| 3、反运算符方法 | ||
| __radd__(self, other) | 加法,如a+b,当a不支持__add__()操作时,调用此函数; | 即在运算符的基础上加上 'r' 即可,以下雷同 |
| __rsub__(self, other) | other - self | |
| ………… | ||
| 4、增量赋值运算符方法 | ||
| __iadd__(self, other) | 赋值加法:+= | 即在赋值运算符之前加 'i' ,以下雷同 |
| __isub__(self, other) | 赋值减法:-= | self = self - other |
| ………… | ||
| 5、一元操作符方法 | ||
| __pos__(self) | 定义正号:+x | |
| __neg__(self) | 定义负号:-x | |
| __abs__(self) | 取绝对值 | |
| __invert__(self) | 按位求反:~x | |
| 6、比较操作符方法 | ||
| __gt__(self, other) | 大于:> | |
| __ge__(self, other) | 大于等于:>= | |
| __lt__(self, other) | 小于:< | |
| __le__(self, other) | 小于等于:<= | |
| __eq__(self, other) | 相等:== | |
| __ne__(self, other) | 不等:!= | |
| 7、属性操作 | ||
| __getattr__(self, name) | 当用户访问一个不存在的属性时调用 | 注意 object/super() (所有类的基类) 是无该方法的 |
| __getattribute(self, name) | 访问存在的属性时调用 | 先调用此函数,如找不到该属性,再去调用上面的属性 |
| __setattr__(self, name, value) | 设置属性时调用 | |
| __delattr__(self, name) | 删除一个属性时调用 | |
| property(fget=None, fset=None, fdel=None, doc=None) | 是一个类,主要功能是为了方便类内部函数的调用 |
class C(object): |
| __get__(self, instance, owner) | 描述符被访问时调用 | 想详细了解,请点击这里 |
| __set__(self, instance, value) | 描述符被改变时调用 | |
| __delelte__(self, instance, value) | 删除描述符时调用 | |
| 8、容器类型操作 | ||
| __len__(self) | 求容器的大小(注意与capacity的区别) | 可变和非尅便容器均具备 __len__ 和 __getitem__ |
| __getitem__(self, key) | 获取容器中指定元素的行为 | |
| __setitem__(self, key, value) | 设置容器中指定元素的行为 | 只有可变容器拥有 __setitem__ 和 __delitem__ |
| __delitem__(self, key) | 删除容器中指定元素的行为 | |
| __iter__(self) | 定义迭代器中元素的行为 | |
| __reversed__(self) | 当调用reversed()函数时 | |
| __contains__(self, item) | 成员运算符in/ not in的行为 | |
|
PS: ①.以上所有的魔法方法,君采用__xx__形式(__为双 "_",双下划线) ②.以上魔法方法为Python解释器自动调用,当然也可以手动调用 ③.魔法方法Python解释器自动给出默认的,因此除非需要改变其内部功能,其它时刻刻使用默认魔法方法 ④.魔法方法是针对class而言的,脱离了”类“谈magic_method是没有意义的 ⑤.*argv为可变的参数列表,类似C语言的va(variable argument),注意与指针的区别,python中暂时忘掉指针,因为python的内存机制都是解释器自动完成的 |
||
Python魔法方法总结及注意事项的更多相关文章
- 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的处处皆是.它们是一些可以让你对类添加"魔法"的特殊方法. 它们经常是两 ...
随机推荐
- PHP服务器脚本 PHP内核探索:新垃圾回收机制说明
在5.2及更早版本的PHP中,没有专门的垃圾回收器GC(Garbage Collection),引擎在判断一个变量空间是否能够被释放的时候是依据这个变量的zval的refcount的值,如果refco ...
- Https握手协议以及证书认证
1. 什么是https Https = http + 加密 + 认证 https是对http的安全强化,在http的基础上引入了加密和认证过程.通过加密和认证构建一条安全的传输通道.所以https可以 ...
- 【转】如何成为一位优秀的创业CEO
编者按:本文来自 Ryan Allis,是一位来自旧金山的创业者和投资人.在 2003 年创立了 iContact,并任 CEO. 做创业公司的 CEO 可以说是世界上最有挑战性的事情之一.你得让客户 ...
- 【G】系列导航
G.开源的分布式部署解决方案 [G]开源的分布式部署解决方案 - 预告篇 [G]开源的分布式部署解决方案(一) - 开篇 [G]开源的分布式部署解决方案(二) - 好项目是从烂项目基础上重构出来的 [ ...
- Previous operation has not finished; run 'cleanup' if it was interrupted
在使用myeclipse的时候,点击保存的时候,控制台窗口总是弹出这个svn :Previous operation has not finished; run 'cleanup' if it was ...
- flex中创建弹出窗口,并传值
在flex页面中首先创建一个弹出窗口,代码如下: <?xml version="1.0" encoding="utf-8"?> <s:Titl ...
- HTTP认证
参考博文:HTTP协议详解 HTTP请求报头: Authorization HTTP响应报头: WWW-Authenticate HTTP认证是基于质询/回应(challenge/response)的 ...
- 如何记录selenium自动化测试过程中接口的调用信息
上一篇博客,我写了python自动化框架的一些知识和粗浅的看法,在上一篇中我也给自己提出一个需求:如果记录在测试过程中接口的调用情况?提出这个需求,我觉得是有意义的.你在测试过程中肯定会遇到一些莫名其 ...
- dellR720重启找不到启动引导项,手动选择也无用。
机器重启后显示 no boot device available.(如下图)检查bios中设置也是没问题的,因为装完系统后根本没动过什么.F11手动选择启动项也还是会跳到这里来. 这台机子做的Raid ...
- JAVA加密算法系列-AES
package ***; import java.io.UnsupportedEncodingException; import java.security.InvalidKeyException; ...