前言
背景
好久没写Python了,翻了一下以前的笔记,发现挺陌生哈哈。既然如此,反正暑假比较闲,每天早上打算分享一下自己笔记,顺便给自己梳理复习。
目前打算分为魔术方法和高级语法,有时间可能会介绍一下设计模式
前排提示:这个系列比较抽象,不适合小白。很少写文章,如果有语法或者排版错误,欢迎d我。
什么是魔术方法?
根据《流畅的Python》第一章原文:
魔术方法(magic method)是特殊方法的昵称。当Python解释器碰到特殊的句法时,会使用特殊方法去激活一些基本的对象操作,这些特殊方法的名字以两个下划线开头,以两个下划线结尾(如__getitem__)。当我们使用my_collection[key]去获得元素的时候,解释器实际上会调用my_collection.__getitem__(key)。
魔术方法包括以下操作:
迭代
集合类
属性访问
运算符重载
函数和方法的调用
对象的创建和销毁
字符串表示形式和格式化
管理上下文
------分割线------
正文
魔术方法(1):使用__str__与__repr__进行字符串操作
Python中我们经常使用Print来打印一个变量或者说对象,有个经典对话如下
Q:大佬们,我这个程序一直运行不起来,怎么调试啊?
A:Print一下
但是你有没有想过,我们打印的背后,到底是如何实现将一个对象转为方便阅读的字符串的?
这背后就是__str__与__repr__的功劳了,让我们编写一段代码来展示一下
__str__与__repr__
继续编写一个测试
测试
运行结果
区别似乎不明显?那来看一下官方库的相关实现吧。datetime是一个内置库,内部封装了一些关于时间的操作,比如时间戳转换,日期转换,让我们来调用一下看看他的__str__与__repr__是返回什么。
官方库的实现
运行显示
我们有如下结论,或者说是建议:
__str__返回的结果可读性强,是用来供人阅读的信息
__repr__返回的结果更加准确,目的在于调试,便于开发者使用
有两点需要额外提示一下
__repr__返回的值在命令行上是可以直接执行的。我们可以打上断点来在控制台验证这一点
在没有重载__str__方法的情况下,它内部默认调用的其实是__repr__方法。我们可以删除__str__重写,来调用str操作来观察