Python进阶-魔术方法(1)


3楼猫 发布时间:2024-08-13 13:12:27 作者:赢赢赢赢麻 Language

前言

背景

好久没写Python了,翻了一下以前的笔记,发现挺陌生哈哈。既然如此,反正暑假比较闲,每天早上打算分享一下自己笔记,顺便给自己梳理复习。

目前打算分为魔术方法高级语法,有时间可能会介绍一下设计模式

前排提示:这个系列比较抽象,不适合小白。很少写文章,如果有语法或者排版错误,欢迎d我。


什么是魔术方法?

根据《流畅的Python》第一章原文:

魔术方法(magic method)是特殊方法的昵称。当Python解释器碰到特殊的句法时,会使用特殊方法去激活一些基本的对象操作,这些特殊方法的名字以两个下划线开头,以两个下划线结尾(如__getitem__)。当我们使用my_collection[key]去获得元素的时候,解释器实际上会调用my_collection.__getitem__(key)。

魔术方法包括以下操作:

  • 迭代

  • 集合类

  • 属性访问

  • 运算符重载

  • 函数和方法的调用

  • 对象的创建和销毁

  • 字符串表示形式和格式化

  • 管理上下文


------分割线------


正文

魔术方法(1):使用__str__与__repr__进行字符串操作


Python中我们经常使用Print来打印一个变量或者说对象,有个经典对话如下

Q:大佬们,我这个程序一直运行不起来,怎么调试啊?

A:Print一下

但是你有没有想过,我们打印的背后,到底是如何实现将一个对象转为方便阅读的字符串的?

这背后就是__str__与__repr__的功劳了,让我们编写一段代码来展示一下

Python进阶-魔术方法(1)-第0张

__str__与__repr__

继续编写一个测试

Python进阶-魔术方法(1)-第1张

测试

Python进阶-魔术方法(1)-第2张

运行结果

区别似乎不明显?那来看一下官方库的相关实现吧。datetime是一个内置库,内部封装了一些关于时间的操作,比如时间戳转换,日期转换,让我们来调用一下看看他的__str__与__repr__是返回什么。

Python进阶-魔术方法(1)-第3张

官方库的实现

Python进阶-魔术方法(1)-第3张

运行显示

我们有如下结论,或者说是建议:


  • __str__返回的结果可读性强,是用来供人阅读的信息

  • __repr__返回的结果更加准确,目的在于调试,便于开发者使用

有两点需要额外提示一下

  1. __repr__返回的值在命令行上是可以直接执行的。我们可以打上断点来在控制台验证这一点

  2. 在没有重载__str__方法的情况下,它内部默认调用的其实是__repr__方法。我们可以删除__str__重写,来调用str操作来观察

Python进阶-魔术方法(1)-第3张

 repr会在命令行调用

Python进阶-魔术方法(1)-第3张

str默认调用repr实现


© 2022 3楼猫 下载APP 站点地图 广告合作:asmrly666@gmail.com