什么是魔法函数?记一次“产脸”后的总结
2018-03-19 23:15
225 查看
XX:“你觉得你Python掌握程度如何?了解,熟悉,还是精通”。 我: “我觉得我自动化测试和工具开发应用的还不少,应该算熟悉吧”。
XX:”那你给我讲讲什么是魔法函数?”
我:“…………………………….(感觉像吃了陀翔般难受,明明知道肯定是用过,硬是像不起什么它的概念,脸产的啪啪响)”
是的,魔法函数,每天都在用,只要写Python代码就会用:
是的只要定义一个类,需要再实例创建时对它进行初始化就需要定义init函数,而init函数正式所谓的魔法函数。
其实魔法函数就是Python类中具有特定功能的内置函数。我在使用的时候常常将其重载来实现或扩展新的功能(体现的是面向中通过重载来实现多态的思想),比如,上述 Test类在定义时,就是重载了基类object的init方法。
一个类内置的的魔法方法,远不只有init这一个,我们调用dir接口,就能看到一个Python类还提供了如下这些魔法函数:
(还有一些并不能通过dir打印出来,但在IDE做联想的时候可以选择…为什么呢?还没弄明白)
那么关于Python默认功能,操作,运算符大多要基于这些魔法参数实现,比如:
那么,只要重载Python所提供功能所对应的魔法函数就可以改变/扩展Python所提供的默认的能力(比如运算符)例:
是不是有点像C++里面运算符重载的意味?
XX:”那你给我讲讲什么是魔法函数?”
我:“…………………………….(感觉像吃了陀翔般难受,明明知道肯定是用过,硬是像不起什么它的概念,脸产的啪啪响)”
是的,魔法函数,每天都在用,只要写Python代码就会用:
class Test(object): def __init__(self): pass
是的只要定义一个类,需要再实例创建时对它进行初始化就需要定义init函数,而init函数正式所谓的魔法函数。
其实魔法函数就是Python类中具有特定功能的内置函数。我在使用的时候常常将其重载来实现或扩展新的功能(体现的是面向中通过重载来实现多态的思想),比如,上述 Test类在定义时,就是重载了基类object的init方法。
一个类内置的的魔法方法,远不只有init这一个,我们调用dir接口,就能看到一个Python类还提供了如下这些魔法函数:
print(dir(Test)) #打印结果: ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']
(还有一些并不能通过dir打印出来,但在IDE做联想的时候可以选择…为什么呢?还没弄明白)
那么关于Python默认功能,操作,运算符大多要基于这些魔法参数实现,比如:
那么,只要重载Python所提供功能所对应的魔法函数就可以改变/扩展Python所提供的默认的能力(比如运算符)例:
class INT_NUM(int): def __init__(self, num): self.num = num # 重载 == 符号的实现,整数位数的比较 def __eq__(self, other): return len(str(self.num)) == len(str(other.num)) print(INT_NUM(1) == INT_NUM(2)) #打印结果为True
是不是有点像C++里面运算符重载的意味?
相关文章推荐
- 与大家分享一下我的面试经历,也算对自己的一次总结。大家有什么心得,意见都可以畅所欲言。
- C++中inline函数的定义为什么要放在头文件中?头文件中“只定义一份”是什么意思?const object 和inline函数是“一次定义规则”
- Excel常用函数总结--记一次数据操作中使用函数
- 一次调用,两次返回--fork函数学习总结
- tcp是什么?深刻理解tcp协议-----------tcp协议总结
- 项目中的一些函数总结
- python之函数的类的方法总结【进阶篇】
- 内核中各种出错函数的总结
- Sql常见问题总结二(Sql语句怎么样查询IP,游标去重复,各种函数使用,各种取时间格式,字符串精确排序,超时锁问题)
- pl/sql查询函数总结
- C语言string.h常用函数总结
- C++中的函数指针和函数对象总结
- 内存分配函数总结
- Oracle 的 to_date 函数详解 日期总结
- Matlab中使用Plot函数动态画图方法总结
- C++ 中函数后面跟const是什么意思
- 什么是C++虚函数、虚函数的作用和使用方法
- c字符串和字符串函数学习总结
- 总结函数声明提升,闭包,作用域,this
- 关于函数指针的总结