Python 进阶

本文介绍了Python中的魔法函数,特别是双下划线开头的内置函数,它们用于实现面向对象编程的关键特性。通过__str__和__repr__方法展示了备用机制,当类没有实现__str__时会调用__repr__。还讨论了Python的__len__方法,其在CPython解释器下具有O(1)的时间复杂度,并通过备用机制保证了行为一致性。
摘要由CSDN通过智能技术生成

第三章 魔法函数

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之禅中的一句话,不能让特例开始打破既定规则。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值