1、何为魔法方法:

  Python中,一定要区分开函数和方法的含义;

  1.函数:类外部定义的,跟类没有直接关系的;形式: def func(*argv):

  2.方法:class内部定义的函数(对象的方法也可以认为是属性);分为两种:

    ① python自动产生的(魔法方法):一般形式为 __func__(),python会在对应的时机自动调用该函数;

    ② 人为自定义的方法:一般和普通函数没有区别,只是定义在了class中而已

  3.方法与函数的区别:

    方法可认为是函数的特殊情况;

    ① 方法定义在class内部

    ② 方法的第一个参数应为 cls(类方法) 或者 self(实例方法)

2、魔法方法汇总:

Python 魔法方法汇总
方法 描述 备注
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):
def getx(self): return self._x
def setx(self, value): self._x = value
def delx(self): del self._x
x = property(getx, setx, delx, "I'm the 'x' property.") >>> c=C()
>>> c.x=10
>>> c.x
10
__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魔法方法总结及注意事项的更多相关文章

  1. python魔法方法:__getattr__,__setattr__,__getattribute__

    python魔法方法:__getattr__,__setattr__,__getattribute__ 难得有时间看看书....静下心来好好的看了看Python..其实他真的没有自己最开始想的那么简单 ...

  2. python魔法方法大全

    1.python魔法方法详解: python魔法方法是可以修改重载的,如果你的对象实现(重载)了这些方法中的某一个,那么这个方法就会在特殊的情况下被 Python 所调用,你可以定义自己想要的行为,而 ...

  3. python 魔法方法补充(__setattr__,__getattr__,__getattribute__)

    python 魔法方法补充 1 getattribute (print(ob.name) -- obj.func())当访问对象的属性或者是方法的时候触发 class F(object): def _ ...

  4. 1. Python 魔法方法

    Python 魔法方法 基础: 如果你想... 所以,你写... Python调用... 初始化一个实例 x = MyClass() x.__init__() 作为一个字符串的"官方&quo ...

  5. with上下文管理 python魔法方法

    with语法在Python里很常见, 主要的利好是使用代码更简洁. 常见的使用场景有: 1. 资源对象的获取与释放. 使用with可以简化try...finally ... 2. 在不修改函数代码的前 ...

  6. python 魔法方法诠释

    什么是Python魔法方法 什么是魔法方法呢?它们在面向对象的Python的处处皆是.它们是一些可以让你对类添加"魔法"的特殊方法. 它们经常是两个下划线包围来命名的(比如 ini ...

  7. python 魔法方法

    I am not a creator, I just a porter. Note: Everything is object in python. 对于Python来说一切都是对象,也就是函数的参数 ...

  8. python 魔法方法之:__getitem__ __setitem__ __delitem__

    h2 { color: #fff; background-color: #7CCD7C; padding: 3px; margin: 10px 0px } h3 { color: #fff; back ...

  9. python 魔法方法(学习过程的笔记)

    有小伙伴会问,什么是python的魔法方法,python的魔法方法有什么用呢, 它们在面向对象的Python的处处皆是.它们是一些可以让你对类添加"魔法"的特殊方法. 它们经常是两 ...

随机推荐

  1. 使用python landport库快速实现排行榜

    背景介绍 排行榜业务使用的频率实在太高了,各种活动都会使用排行榜.经过多次开发后我觉得实现一个简单的排行榜库,它能够完成当前我遇到的所有业务逻辑问题,也希望能够帮助到想要快速开发排行榜业务的同行. 我 ...

  2. FastCGI超过活动超时时间

    线上环境:PHP5.4 and IIS 打开IIS管理器,找到FastCGI,打开后编辑选项 活动超时默认为70(秒) 请求超时默认为90(秒) 可根据项目需求来更改这两项的值

  3. springmvc框架原理

    1.  用户发送请求至前端控制器DispatcherServlet 2.  DispatcherServlet收到请求调用HandlerMapping处理器映射器. 3.  处理器映射器根据请求url ...

  4. VMware Ubuntu16.04虚拟机安装MATLAB R2016b

    因为这学期上的模式识别课程需要在Linux环境下使用Matlab,所以就在Windows10主机上的Vmware Workstation上的Ubuntu虚拟机上安装了最新版本的MATLAB. 环境: ...

  5. MSDN官方数据库开发群

    QQ群1:43563009 创建人:中国风(Roy_88) 创建时间:2007-07-21 当前人数:326人 QQ群2:27156079 创建人: fcuandy 创建时间:2008-03-20 当 ...

  6. webstorm入手笔记

    一.webstorm学习前小记 webstorm是一款现在前端用的比较多的IDE,其优势也比较多,这个大家在网上随便搜搜就可以找到了.但是本人大部分的时间都是使用sublime text工作,最近由于 ...

  7. Android学习笔记---前传

    在正式的撰写个人的学习笔记前,先对个人的学习经历做一个简要的介绍.座右铭:诚不欺我 1. 前言 本人非软件工程出身,属于半路出家,误打误撞进入这个行业,初心是软件开发的门槛低,自以为学习过C语言,轻度 ...

  8. eclipse如何安装插件

    eclipse安装插件以springsource-tool-suite为例 打开eclipse,找到help/About Eclipse/ 然后点击右下角图标 找到EclipsePlatform对应的 ...

  9. js实现哈希表(HashTable)

    在算法中,尤其是有关数组的算法中,哈希表的使用可以很好的解决问题,所以这篇文章会记录一些有关js实现哈希表并给出解决实际问题的例子. 第一部分:相关知识点 属性的枚举: var person = { ...

  10. scss语法介绍

    这里既然是对语法的介绍,那么至于如何安装和编译scss我就不多少了,主要是因为本人在群里认识的小伙伴有的不会用scss,所以就借着放假的机会来对scss语法做个总结,博主在开发过程中用scss蛮多,所 ...