第三章 魔法函数
3.1 什么是魔法函数
- Python内置的以双下划线开头的都是魔法函数(自定义的没有用),众所周知,Python是面向对象编程的语言,面向对象编程的三大特性,封装、继承和多态都体现得很自然,而Python中具有特色的是协议和鸭子类型,Python中只要实现了特定的魔法方法就会有对应的功能,这也是协议和鸭子类型的表现。例如,对一个类实现了__getitem__方法就能将类编程序列,实现了__str__方法打印对象时就会打印出返回值,而Python中另一个特色就是备用机制,这也是我喜欢Python的原因之一,当使用len()方法获取对象长度时,会首先查看类中有没有实现__len__方法,如果没有实现将会调用__iter__进行遍历,如果__iter__也没有实现的话就会进一步调用__getitem__方法遍历知道触发异常获取len值,同样打印对象时没有实现__str__方法就会寻找__repr__方法,除此之外,备用机制在数值运算中也有很多应用。
__str__和__repr__方法同时存在时优先执行__str__
class MyClass():
def __str__(self):
return "it's my class in str"
def __repr__(self):
return "it's my class in repr"
my_object = MyClass()
print(my_object)
## it's my class in repr
__str__方法不存在时执行__repr__方法
class MyClass():
# def __str__(self):
# return "it's my class in str"
def __repr__(self):
return "it's my class in repr"
my_object = MyClass()
print(my_object)
## it's my class in repr
3.2魔法函数一览
3.3Python中的len()方法
Python中求序列的length是一个常用的操作,因此,Python使用__len__方法时,CPython解释器会直接获取c语言Struct的length参数,因此时间复杂度为O(1),即便没有CPython解释器没有调用任何方法,但是Python层面还是实现了__len__这就印证了Python之禅中的一句话,不能让特例开始打破既定规则。