作者:Python进阶者

来源:Python爬虫与数据挖掘

燕雀安知鸿鹄之志哉?

/1 前言/

魔法方法是python 里面非常重要的一个分支,平时我们写代码或多或少都会接触到他们,而且他们所产生的作用也是非常巨大的,不得不说,尤其是大型企业开发讲究工整性的时候,用好魔法方法就等于掌握了Python的命脉这样说也丝毫不夸大其词。之所以叫魔法方法自然是因为他们足够强大这一点毋庸置疑。

下面我们就来看看基本的魔法方法,给大家和魔法方法一个零距离接触的机会,也就是给小编一个机会,因为你们的支持才是小编的不竭动力,哈哈哈哈。

/2 基本魔法方法/

如下表所示。

魔法方法 含义
基本的魔法方法
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)时的行为

看了这么多,大家可能会暂时觉得有点懵,怎么这么多,这些都要记住吗,天哪??心中是否有种顿时无数只草泥马飘过的感觉,噗嗤!!!

有这种感觉很正常,不过小编来跟大家说,这些不需要全部记住,就像Python 中的模块和其中的方法,你也不需要全部都记住,为什么呢?

因为你要想全部记住,没有谁能有这个脑子,人家电脑硬盘还有空间限制了,更何况人脑了,当然,不排除那些逆天的存在哈,你们随意,小编只给大佬鼓鼓掌~

下面,小编就挑其中几个跟大家说说,都是经常用到的,比较具有代表性,你懂得。

/3 常用魔法方法/

魔法方法 什么时候被调用
new(cls[, ...]) 在实例创建时调用
init(self[, ...]) 在初始化时调用
del(self[, ...]) 对象被垃圾回收时调用
getattr(self, name) 访问不存在的属性
setattr(self, name) 给属性赋值
_delattr(self, name) 删除属性
getattribute(self, name) 访问任意属性
len(self) 索引个数
getitem(self, key) 使用索引访问某个元素
setitem(self, key, value) 使用索引给某个元素赋值
delitem(self, key) 使用索引删除某个对象
iter(self) 迭代
reversed(self) 元素反转
enter(self) with声明的上下文管理器
exit(self, exc, val, trace) with 声明的上下文管理器
str(self,value) 返回用户看到的字符串
repr(self,value) 返回程序开发者看到的字符串

/4 案例例举/

1、构造初始化清除魔法方法

class student:def __new__(self):print('start')def __init__(self):self.name='任性的90后boy'self.age=100self.gender='famle'self.enjoy='do love'print(self.age)def __del__(self):print(self.name)print('end')s=student()
print(id(s))

运行结果如下图:

可以看出 , init 并不是第一个被调用的方法,第一个被调用的是 new,这个 方法才真正地创建了实例,当这个对象的生命周期结束的时候, del 会被调用。

其实这些创建实例和销毁实例的过程编译器早帮我们做好了,不需要我们再去多此一举。

可以看出new这个魔法方法运行了之后了,init就没他什么事了,可怜的init,但是为什么我们在实际过程中使用最多的却是init呢?

我们都知道编程语言发展至今都比较智能了,像Java,Python等这些面向对象的语言,都能实现自动创建实例的功能。

今天我们说的Python就是其中之一了。所以创建实例功能显得不是那么重要了,于是乎new出现的几率也就小了,那么init是做什么的呢?

它其实就是初始化方法的构造器,大家都知道,一个类写出来是必须要初始化的,不然无法运行,所以可见其重要性。

2、那么我们只需这样就可以了,如图:

这样就正确显示出我们想要的结果了。

3、属性访问魔法方法。此类魔法方法可以定义私有属性然后使用公有的getter和setter,实现了一系列的封装。

class att:#定义当该类的属性被访问时的行为(不管是不是存在该属性,若不存在,则调用__getattr__(self,name))#例如:对于类的实例对象object,执行print(object.aa)获取object的aa属性,就会调用该函数#最好不要使用它,使用范围相对有限,容易出现Bugdef __getattribute__(self, item):print('getattribute')super().__getattribute__(item)#定义当用户试图获取一个不存在的属性时的行为#例如:对于类的实例对象object,执行print(object.aa)获取object的aa属性不存在时,就会调用该函数def __getattr__(self,name):print('getattr',name)#定义当一个属性被设置时的行为#例如:对于类的实例对象object,执行object.aa = 1设置object的aa属性的值,就会调用该函数def __setattr__(self,name,value):print('setattr')super().__setattr__(name,value)#定义当一个属性被删除时的行为#例如:对于类的实例对象object,执行del object.aa删除object的aa属性的值,就会调用该函数def __delattr__(self,name):print('delattr')super().__delattr__(name)if __name__ == '__main__':at = att()at.ab = 1print(at.ab)del at.ab

运行后的效果如图:

4、自定义序列魔法方法也称容器类魔法方法。此类魔法方法可以让你的类表现的像内建序列类型一样,比如:字典,元祖,列表,字符串等。

class Function:'''一个列表的封装类,实现了一些额外的函数式方法'''def __init__(self, values=None):if values is None:self.values = []else:self.values = valuesdef __len__(self):return len(self.values)def __getitem__(self, key):return self.values[key] # 如果键的类型或值不合法,列表会返回异常def __setitem__(self, key, value):self.values[key] = valuedef __delitem__(self, key):  #删除键对应值del self.values[key]def __iter__(self):          #返回可迭代对象的值return iter(self.values)def __reversed__(self):      #返回经过反转后的值return reversed(self.values)def append(self, value):     #向可迭代对象中添加值self.values.append(value)def first(self):             # 取得第一个元素return self.values[0]  def tail(self):               # 取得除第一个元素外的所有元素     return self.valuse[1:]def xx(self):                 # 取得除最后一个元素外的所有元素return self.values[:-1]def last(self):               # 取得最后一个元素   return self.values[-1]def selector(self, n):        # 取得除前n个元素外的所有元素  return self.values[n:]def head(self, n):            # 取得前n个元素 return self.values[:n]
ff=Function([32,3,23,3,22,22,3,2,33,2])
print('更改前:',ff.__getitem__(2))
ff.__setitem__(2,43)
print('更改后:',ff.__getitem__(2))

运行后的结果,如图:

可以看到他的确实现了如同列表般的部分功能,这就是他的厉害之处。而且可以自定义更多的实用功能,轻松实现功能从而减少不必要的冗余代码。

5、上下文管理器的魔法方法。

1)用魔法方法enter和exit进行重写,可实现上下文管理器。

2)利用上下文管理器模块重写with open 方法。

6、最后一个最常用的就是 repr 和str了,如图:

◆ ◆ ◆  ◆ ◆

号主新书已经在京东上架了,想要一睹为快的朋友,可以直接下单购买,目前京东正在举行活动,大家可以用原价5折的预购价格购买,3天左右会发货,还是非常划算的:

扫描下方二维码即可进入京东的购买链接(https://item.jd.com/12686131.html):


数据森麟公众号的交流群已经建立,许多小伙伴已经加入其中,感谢大家的支持。大家可以在群里交流关于数据分析&数据挖掘的相关内容,还没有加入的小伙伴可以扫描下方管理员二维码,进群前一定要关注公众号奥,关注后让管理员帮忙拉进群,期待大家的加入。

管理员二维码:

猜你喜欢

● 笑死人不偿命的知乎沙雕问题排行榜

● 用Python扒出B站那些“惊为天人”的阿婆主!

● 全球股市跳水大战,谁最坑爹!

● 华农兄弟、徐大Sao&李子柒?谁才是B站美食区的最强王者?

● 你相信逛B站也能学编程吗

点击阅读原文即可参与京东5折购书活动

一篇文章带你读懂Python的魔法方法相关推荐

  1. 无线充电技术究竟有何神秘之处?一篇文章带你读懂什么是无线充电技术

    无线充电技术这个概念在很早之前就已经被提出了,发展至今在电子领域已经被深入研究应用,虽然还未曾大范围普及,但在消费电子领域的发展已经取得不错的成绩.手机厂商也纷纷在自家旗舰机上加入这一革新性的先进充电 ...

  2. java ee 值范围_一篇文章带你读懂: Java EE

    原标题:一篇文章带你读懂: Java EE 点击上图,查看教学大纲 何为 Java EE Java EE是一个标准中间件体系结构 不要被名称"Java PlatformEnterprise ...

  3. 一篇文章带你搞懂Python中的类

    前言 今天我们要说的是面向对象的核心-----类,类能帮我们把复杂的事情变得有条理,有顺序,希望大家通过学习类能改善自己的编码风格,使代码变得更为好看,更加通俗易懂. 1.类的用法 一.什么是类 类( ...

  4. 强连接运营社张强:一篇文章带你读懂私域流量的本质和玩法

    "私域流量"越来越火! 身边很多商家朋友都在布局这个事情,但提起"私域流量",大家仍然茫然不知所措- "私域不就是建立一些个人微信号?把会员从线下门店 ...

  5. 一篇文章带你读懂 MySQL 和 InnoDB

    作者 | Draveness  原文地址 | http://draveness.me/mysql-innodb.html 作为一名开发人员,在日常的工作中会难以避免地接触到数据库,无论是基于文件的 s ...

  6. 一篇文章带你读懂批处理命令

    批处理,顾名思义,批量处理,它可以将复杂的事情变得简单,最早出现在dos操作系统中,也就是我们经常说的cmd黑窗口,这在早期没有gui界面的时候用的是最多的,而且命令比较丰富,虽然现在有很多功能都被封 ...

  7. 两个必看协议-最全面-最直接-最暴力-一篇文章带你读懂-HTTP、HTTPS

    Web服务基础知识 我们每天都会用web客户端上网,浏览器就是一个web客户端,例如谷歌浏览器,以及火狐浏览器等. 当我们输入https://blog.csdn.net/xie_qi_chao时候,很 ...

  8. 一篇文章带你读懂JSP的使用的理解

    JSP语言是干嘛的呢?一句话:就是在html中编写java代码.能够直接在页面中运行并编译,能够访问已经存在的类接口等,在jsp中的java与你在后台写的java功能一样.相比servlet中,我们响 ...

  9. 一篇文章带你读懂真正的大数据公司

    马云卸任演讲时说了这么一句话:很多人还没有搞清楚什么是PC互联网,移动互联网来了,我们还没有搞清楚移动互联网的时候,大数据时代又来了. 现在的数据,可谓是时下最炙手可热的东西了.想当年,有" ...

最新文章

  1. 一个非常简单的滚动代码
  2. PL/SQL程序设计(一)—— PL/SQL程序设计简介
  3. python的read_csv_python,pd.read_csv成熟导入
  4. xms和xmx为什么要相同_股民为什么要做股票配资?
  5. 2020年中国住宿业市场网络口碑报告
  6. 余承东:鸿蒙系统将与科大讯飞开放平台共同推动AI商业化
  7. 链路聚合的配置(思科)
  8. 新版Airplayer--新功能介绍
  9. cassss服务未启动_aws启动ssserver
  10. 【js】自爆脚本,我抢了124盒月饼,马云看了也很惊讶
  11. sql server触发器写法
  12. tcl/tk 的安装
  13. python中numpy矩阵的零填充
  14. 网格(grid)布局
  15. 机器学习之支持向量回归(SVR)——南京审计大学金审学院
  16. 三星S4 I9502刷机教程
  17. 块存储:AIO的直接写流程注释
  18. 2022第三届全国大学生网络安全精英赛练习题(5)
  19. ios-block-对象与对象之间的解偶合
  20. 浪潮英信NF5280M4服务器蓝屏

热门文章

  1. ADS器件无法连接导线的问题
  2. 2013工程量清单计价规范GB50500-2013
  3. ESP32 WIFI MESH学习笔记8-物联网与控制(手机APP部分)
  4. MySQL学习笔记——课后练习
  5. ps简单单页设计心得
  6. 第四十五章 龙牙现身(老顽童们2 )
  7. 微软 Windows Server 2016 简体中文 MSDN 官方原版 ISO 镜像下载
  8. 金蝶云星空与奇门WMS-A对接集成委外领料查询打通出库单创建
  9. HDU 4339 - Query
  10. 取代华为5G网络?日本NEC宣布在英国推广RAN网络