Python语言规范定义了很多 的所谓基础协议,这些协议大都有内置实现,编程时我们可以不必太关注,但认识理解一下还是很有益处的,可以更有助于理解Python程序的底层逻辑。

前言
作为动态型解释性高级编程语言的Python,其程序的执行时依赖解释器的。解释器就好比现在的翻译软件,负责把你编写的程序代码翻译给机器所能理解的指令并执行。你所编写的代码必须隐式或显式地遵循特定“翻译软件”的基本体系规范,否则就是鸡鸭对话了——而Python中这些基本的体系规范,用术语表示就是“协议”(Protocol,或者简单理解为接口规则或内置方法)就是这些基础协议支撑起了Python的生态世界。
Python语言规范中基本协议类型很多,这些协议的实现往往都是C语言实现的,我们不需要查看源码,但认识这些协议后,你将对程序的底层逻辑更清晰。
Python中的基本协议有对象协议、数字协议、比较协议、转换协议、容器协议、迭代协议、属性协议、函数协议、上下文管理协议等等。本文主要介绍对象协议:
对象协议
对象(Object)是Python中所有类(Class)的基类,下表中为基本的对象协议(方法),始于与对象的整体管理有关,用以实现对象的创建、初始化、销毁和表示。
- __new__(cls[*args, **kwargs]):静态方法,调用以创建新实例;
- __init__(self[*args, **kwargs]):对象创建后调用以进行初始化;
- __del__(self):销毁对象是调用;
- __repr__(self):创建对象的一个字符串表示。
下面分别概要介绍一下:
协议方法__new__()和__init__()通常是一起使用来创建和初始化实例。当通过调用SomeClass(args)创建对象时,它将被转换为以下步骤:
x = SomeClass.__new__(SomeClass, args)
if isinstance(x, SomeClass):
x.__init__(args)
通常,这些步骤是在幕后处理的,不必太担心。在类中实现的最常见方法是__init__()。使用__new__()时几乎总是表明存在与实例创建相关的高级魔法(例如,在想要绕过__init__()的类方法中使用,或在某些创建设计模式中使用,如定义单例或缓存)。__new__()的实现不一定需要返回相关类的实例——如果不是,则后续调用在创建时跳过__init__()。
__del__()方法在实例即将被垃圾收集时被调用。此方法仅在实例不再使用时调用。需要注意的是,del x语句只会减少实例引用计数,并不一定会导致调用此函数(__del__())。除非实例需要在销毁时执行额外的资源管理步骤,否则几乎从不定义__del__()。
由内置的repr()函数调用的__repr__()方法创建对象的字符串表示形式,这对调试和结果输出很有用。
这个方法还负责创建在交互解释器中检查变量时看到的值的输出。约定是让__repr__()返回一个表达式字符串,可以用eval()对其求值以重新创建对象。例如:
>>> a = [2, 3, 4, 5] # 创建列表哦
>>> s = repr(a) #s='[2, 3, 4, 5]'
>>> b = eval(s)
>>> b
[2, 3, 4, 5]
如果不能创建简单的字符串表达式,则约定由__repr__()返回该形式的字符串
<...message...>,如下所示:
>>> f =open('D:\\tmp\\testx.txt')
>>> a = repr(f)
>>> a
"<_io.TextIOWrapper name='D:\\\\tmp\\\\testx.txt' mode='r' encoding='cp936'>"
>>>
更多对象协议
要想查看多想更多的其它“协议方法”,你可以在IDLE Shell下输入如下内容看看:
>>> dir(object)# 回车后显示内容如下:

对象object内置的协议(方法)
dir是Python内置的一个函数,可以快捷的查看相关方法或类的说明描述。对象够的其它方法这里就不一一解释了。可以在shell下输入如下形式的函数来查看相应的方法描述:
help(object.__xxx__)# xxx就是上述引号的内容。
最后
本篇就介绍这些了。下次内容接续介绍Python相关内置的规范——其它的协议方法。
点个赞,分享出去吧。谢谢,下次再见~