引言
- 魔法函数是
Python中定义的,以__开头,__结尾,形如__fun__()的函数,一般使用语言中已经定义好了的即可。 - 使用这样一些函数,可以让我们自定义的类有更加强大的特性。
- 魔法函数一般是隐式调用的,不需要我们显示调用。
现在有这么一个类,它维护了一些语言列表。
class Language(object):def __init__(self, language_list):self.lans = language_list# 如果要遍历所有的语言,可以:language = Language(["Python", "C", "Lisp"])for lan in language.lans:print(lan)# result:# Python# C# Lisp
用魔法函数也可实现上面的功能,而且使用起来会更加简洁。
class Language(object):# 没错,这也是一个魔法函数,现在先不关注它def __init__(self, language_list):self.lans = language_list# 定义这样一个魔法函数def __getitem__(self, item):return self.lans[item]language = Language(["Python", "C", "Lisp"])for lan in language:print(lan)# result:# Python# C# Lisp
魔法函数对Python的影响
- 魔法函数不属于定义它的那个类,只是增强了类的一些功能。
- 实现了特定的魔法函数之后,某些操作会变得特别简单。
-
常用魔法函数
非数学运算
字符串表示
__repr__()-
集合、序列
__len__()__getitem__()__setitem__()__delitem__()-
迭代相关
__iter__()-
可调用
-
with上下文管理器
__enter__()-
数值转换
__abs__()__bool__()__int__()__float__()__hash__()-
元类相关
__new__()-
属性相关
__getattr__(),__setattr__()__getattribute__(),__setattribute__()-
属性描述符
__get__(),__set__(),__delete__()携程
__await__(),__aiter__(),__anext__(),__aenter__(),__aexit__()数学运算
看一个例子就行了,因为:
运算方式复杂
实际应用不多 ```python
实现一个二维向量的加法计算
class Vector(object): def init(self, x, y):
self.x = xself.y = y
def add(self, v):
res_v = Vector(self.x + v.x, self.y + v.y)return res_v
def str(self):
return "x: {0}, y: {1}".format(self.x, self.y)
first_vector = Vector(1, 2) second_vector = Vector(3, 4) print(first_vector + second_vector)
result:
x: 4, y: 6
以len()为例
引言
len()函数可以返回一个序列的长度-
原理
当我们使用
len()函数获取一些内置对象(list, tuple, set…)的长度时,性能会非常高,因为这些内置对象使用C语言实现的,同时该方法并未对内置对象进行遍历获得长度,而是内置对象维护了一个长度属性,调用方法后,直接进行属性值的读取即可。结论
某些方法并未我们想象中的那么简单,内部实现时会做很多优化。
- 尽量使用
Python的内置对象,和内置的一些函数,提高效率。小结
魔法函数使得自定义的类型会具有神奇的功能,让我们可以设计更加灵活的类型,它将我们自定义的类型和一些内建类型建立起了关联,明白了更加底层的一些细节,为后面的的深入学习做了一个铺垫。
