
python 魔法方法
2 构造方法
4 删除对象的方法
发布日期:2021-05-07 23:05:31
浏览次数:20
分类:精选文章
本文共 3987 字,大约阅读时间需要 13 分钟。
文章目录
1 魔法方法介绍
- 是Python类与对象里的方法,之所以称之为魔法方法,是因为魔法方法总能在适当的时候Python调用,完成一定的功能
魔法方法具有一定的特征:
- 该方法在重写时,两边总是被双下滑线包围,例如:
__init__(self,*args):
- Python因为有魔法方法而变得十分强大,魔法方法总能在适当的时候被调用
2 构造方法 __new__(cls[,...]):
__new__(cls[,...])
- 是第一个被执行的方法,它的第一个参数是一个类,大多情况下它不需要重写,Python会默认执行。当继承一个不可变的类的时候,又需要对其中的内容进行修改,则需修改该方法
class CapStr(str): def __new__(cls,string): #修改新类里的new方法,需传入一个参数 string = string.upper() return str.__new__(cls,string) #用父类里的new方法进行返回,直接饭后构造后的对象
- new()方法有返回值,它的返回值是类对象实例化出来的类,因此需要返回一个类
def __new__(self,*args,*kwargs): ``` return object.__new__(cls,*atgs,*kwargs)
- 第一个参数 cls 是当前正在实例化的类,Python里的机制是:如果在新类中没有重写new()方法,Python会默认调用父类new()的方法来构造该类的实例。如果该类的父类也没有重写new()方法,那么会一直追溯到object类的new()方法,因为object类是所有类的基类
- 如果新类中重写了new()方法,那么可以自由选择任何一个其他类的new方法类构造实例,但应该注意:在任何新式类的new()方法中,不能调用自身类的new方法来构造实例,这样会造成递归死循环
3 new()方法 与 init()方法的关系:
- 在新的类开始实例化时,new()方法会返回cls的实例化对象,然后该类的init()方法作为构造方法会接受这个实例(即self)作为自己的第一个参数,再依次接收位置参数(args)和命名参数(kwargs)
- new()方法为新类提供了实例化的框架,然后调用init()方法使其更加丰满
类的初始化方法:__init__(self,*args)
- 类在初始化时自动调用该方法,可以实现对实例化类属性的修改
self.value = value
,其返回值为None,如果试图返回,则会报错:
TypeError: __init__() should return None
例如;
class Rectangle(): def __init__(self,x,y): self.x = x self.y = y def getPeri(self): return (self.x + self.y) * 2 def getArea(self): return self.x * self.y
4 删除对象的方法__del__(self)
- 对象被删除时,该方法会被自动调用,Python里的垃圾回收机制自动清除内存。在所有指向该对象的变量名被删除时,del方法才会被调用,例如:
class C(): def __init__(self): print("__init__方法被调用") def __del__(self): #只有实例化后的对象被清理,__del__内置方法才被执行 print("__del__方法被调用")>>> c0 = C()__init__方法被调用>>> c1 = c0>>> c2 = c0>>> del c0>>> del c1>>> del c2 #最后一个指向对象的变量被删除,调用del方法__del__方法被调用
- 对于魔法方法,可以对其进行重写,以算数运算为例,其魔法方法有:
方法 | 算数运算符 |
---|---|
__ 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) | 定义按位或操作的行为: |
- 在Python2.2以前,类与类型是分开的两个概念,类是属性与方法的封装,而类型是整型、浮点型、字符串、布尔类型等等
- 在以后的版本中,Python将他们进行了合并,即Python只有类的概念,将类型的概念也封装为类。Python封装的方式为把BIF改写为工厂函数,我们可以对类型进行重写,类重新定义类,
例如
class New_int(int): def __add__(self,other): return int.__sub__(self,other) def __sub__(self,other): return int.__add__(self,other)>>> a = New_int(2)>>> b = New_int(3)>>> a + b-1>>> a - b5
代码执行的逻辑是:
- 首先把对象实例化,即 a , b 是实例化的对象
- 在进行二目运算符
+
时,Python会现找第一个对象的__add__
方法,把实例化的对象传入,self = a,other = b
- 传入后递归寻找其父类的方法,最终使用了int.__sub__方法
- 有时第一个对象并没有进行类的实例化,这是Python就会采用备用机制,找到第二个对象的方法,进行反运算
方法 | 对应运算符 |
---|---|
__ 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) | 当左操作数不支持相应的操作时被调用 |
>>> class Nint(int): def __radd__(self,other): return int.__sub__(self,other)>>> b = Nint(2)>>> 1 + b1>>> b + 13
同样还有增量运算符:
方法 | 对应运算符 |
---|---|
__ 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) | 定义赋值按位或操作的行为: |
等等,Python提供了许多魔法方法,通过重写魔法方法,可以自由灵活地使用这门语言
5 引用
发表评论
最新留言
逛到本站,mark一下
[***.202.152.39]2025年04月14日 12时00分18秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
AQS相关
2021-05-09
WCF学习之旅—第三个示例之一(二十七)
2021-05-09
java ThreadPoolExecutor初探
2021-05-09
快速指数算法
2021-05-09
python去除字符串中的特殊字符(爬虫存储数据时会遇到不能作为文件名的字符串)
2021-05-09
SpringCloud微服务(03):Hystrix组件,实现服务熔断
2021-05-09
Spring 框架基础(01):核心组件总结,基础环境搭建
2021-05-09
Cassandra数据建模
2021-05-09
Internet Explorer 10 专题上线
2021-05-09
云计算之路-阿里云上:0:25~0:40网络存储故障造成网站不能正常访问
2021-05-09
网站故障公告1:使用阿里云RDS之后一个让人欲哭无泪的下午
2021-05-09
上周热点回顾(6.3-6.9)
2021-05-09
上周热点回顾(8.12-8.18)
2021-05-09
【故障公告】升级阿里云 RDS SQL Server 实例故障经过
2021-05-09
蹒跚来迟:新版博客后台上线公测
2021-05-09
[网站公告]11月26日00:00-04:00阿里云RDS升级
2021-05-09
[网站公告]又拍云API故障造成图片无法上传(已恢复)
2021-05-09
云计算之路-阿里云上:“黑色30秒”走了,“黑色1秒”来了,真相也许大白了
2021-05-09
上周热点回顾(6.9-6.15)
2021-05-09
上周热点回顾(10.20-10.26)
2021-05-09