9. Python的类是如何运作的?(python中类的作用)
off999 2024-11-09 12:53 27 浏览 0 评论
本系列文章译自Python之父 Guido van Rossum 的系列博客“The History of Python”。这个博客系列对我们理解Python及其演变很有帮助,经Guido同意,在这里翻译推荐给大家,希望大家喜欢,也请大家多多指教!
1 基于 C语言的底层机制
说来你可能不信,Python 开发一年后,我们才加入“类(class)”的概念。为了解这段历史,首先要理解 Python 的一些底层实现。
Python 的底层,实际上是基于一个用C语言实现的代码解析器,或者说“虚拟机”,以及也是用C语言实现的几种基本数据类型。虽然 Python 底层架构使用了各种“对象”,但因为C语言不是面向对象语言,所以这些对象的实现,实际上是基于一些特定的数据结构与方法指针。
Python 虚拟机定义了每个对象类型都可以,或者必须实现的数十种标准方法(比如“get attribute”、“add” 、“call”等)。每个对象类型都有一个静态存储的数据空间,其中包含一系列方法指针,每个指针指向一种标准方法。不过,有些标准方法不是必须实现的,于是会出现空指针,这时,Python 虚拟机会抛出运行时错误,或者有时也提供这些方法的默认实现。
另外,对象类型的数据空间里也包含很多其它数据,包括一个存储这个类型的特有方法的列表。每种方法由一个字符串(方法名称)和一个方法指针(具体实现)组成。
Python 独特的自省(introspection)机制,就是基于其独特的,可以在运行时作为一种对象的类型数据结构。
Python 的底层完全是基于 C 语言的,事实上其所有标准方法都是用 C 语言写的。最开始时,Python 解析器只支持纯粹的 Python 函数和用 C 语言实现的这些方法。我记得应该是我们当时的同事,Siebren van der Zee,建议我们应该像 C++ 一样支持“类”,从而实现自定义对象。
2 类的实现
我采用了最简单的设计来实现用户自定义对象:所有对象的实例都用一种新的内置对象表示,这个内置对象包含一个指针和一个字典,指针指向这个实例对应的“类对象(class object)”,而字典中包含了这个对象实例的各种变量,也被称为“实例字典”。
在此实现中,实例字典中的变量是这个实例所具有的独特变量,而类对象则包含这个类的所有实例所共享的东西——尤其是方法。
而在实现类对象的时候,我依然采用了最简单的设计:类的所有方法都被存储在一个字典中,其对应的键值就是方法的名称。我把它叫做“类字典(class dictionary)”。
为支持继承,类对象也会存储指向父类对象的指针。当时,我对类的理解还非常浅薄,不过对 C++ 刚支持的多重继承特性有所了解。因此我想,既然要支持继承,不如也同时支持一个简单版的多重继承。于是,每个类对象都允许有多个父类。
基于这种实现,对象的底层运作机制其实非常简单:不论是改变实例变量还是类变量,都只是修改对应字典的数据而已。
比如说,设置实例变量时,只需要更新它的实例字典;类似地,获取实例变量时,首先检查实例字典中是否有这个变量,如果没有,就在类对象以及父类对象的字典中查找。
不过,在父类对象中查找变量还涉及一些其它问题。实例从类对象和父类对象中获取变量的过程,一般与查找方法的过程一样。如前文所说,方法存储在类对象字典中,由这个类的所有实例共享。因此,调用方法的时候,一般不会在实例字典中找到,而必须查找类对象的字典,之后再从父类对象字典中递归查找。
Python 的最初的默认方法解析顺序(method resolution order,MRO)是采用深度优先,从左至右算法。不过,后来的版本采用了更成熟的 MRO (C3算法),我们会在之后的博文中讨论。
3 简单,但灵活
我希望 Python 类的实现尽量简单。因此,Python 在查找方法的时候,并不会做错误检查或一致性验证。比如说,如果一个类重载了父类的一个方法,Python 不会检查这个重载的方法是否与父类方法有相同的参数,或者相同的调用方式。前文所说的方法解析算法,只是单纯地返回它找到的第一个方法而已。
另外,这种设计还导致了一些其它特性。比如说,虽然类字典最初是用于存储方法的,但也不是不能保存其它对象。因此,如果在类字典中存储整数或字符串,就可以作为类变量——即由所有实例共享的变量。
Python 类的实现非常简单,但也非常灵活。
比如说,因为采用了这种实现方式,Python 中的类也是“一级对象(first-class objects)”,因而在程序运行时可以很容易内省到(introspected),而我们也可以对类进行动态修改。
举例来说,在类对象创建后,通过更新类字典,我们依然可以增加或修改类的方法。(作者注:后来的新式类中,dict 类的修改被控制了,我们依然可以动态地修改类,但必须调用参数设置方法,而不是直接使用 dict 类。)而又因为 Python 是动态类型语言,这就意味着,这个类,及其子类的所有实例,都会立即更新其方法。
类似的,通过修改实例字典,实例的变量也可以动态增加、修改或删除(SmallTalk 语言在对象创建时就限制了实例的变量,与之相比,Python 的这个特性可以说相当自由了)。
本系列译文目录:http://blog.kantli.com/theme/1
公众号:读书录
相关推荐
- 安全教育登录入口平台(安全教育登录入口平台官网)
-
122交通安全教育怎么登录:122交通网的注册方法是首先登录网址http://www.122.cn/,接着打开网页后,点击右上角的“个人登录”;其次进入邮箱注册,然后进入到注册页面,输入相关信息即可完...
- 大鱼吃小鱼经典版(大鱼吃小鱼经典版(经典版)官方版)
-
大鱼吃小鱼小鱼吃虾是于谦跟郭麒麟的《我的棒儿呢?》郭德纲说于思洋郭麒麟作诗的相声,最后郭麒麟做了一首,师傅躺在师母身上大鱼吃小鱼小鱼吃虾虾吃水水落石出师傅压师娘师娘压床床压地地动山摇。...
-
- 哪个软件可以免费pdf转ppt(免费的pdf转ppt软件哪个好)
-
要想将ppt免费转换为pdf的话,我们建议大家可以下一个那个wps,如果你是会员的话,可以注册为会员,这样的话,在wps里面的话,就可以免费将ppt呢转换为pdfpdf之后呢,我们就可以直接使用,不需要去直接不需要去另外保存,为什么格式转...
-
2026-02-04 09:03 off999
- 电信宽带测速官网入口(电信宽带测速官网入口app)
-
这个网站看看http://www.swok.cn/pcindex.jsp1.登录中国电信网上营业厅,宽带光纤,贴心服务,宽带测速2.下载第三方软件,如360等。进行在线测速进行宽带测速时,尽...
- 植物大战僵尸95版手机下载(植物大战僵尸95 版下载)
-
1可以在应用商店或者游戏平台上下载植物大战僵尸95版手机游戏。2下载教程:打开应用商店或者游戏平台,搜索“植物大战僵尸95版”,找到游戏后点击下载按钮,等待下载完成即可安装并开始游戏。3注意:确...
- 免费下载ppt成品的网站(ppt成品免费下载的网站有哪些)
-
1、Chuangkit(chuangkit.com)直达地址:chuangkit.com2、Woodo幻灯片(woodo.cn)直达链接:woodo.cn3、OfficePlus(officeplu...
- 2025世界杯赛程表(2025世界杯在哪个国家)
-
2022年卡塔尔世界杯赛程公布,全部比赛在卡塔尔境内8座球场举行,2022年,决赛阶段球队全部确定。揭幕战于当地时间11月20日19时进行,由东道主卡塔尔对阵厄瓜多尔,决赛于当地时间12月18日...
- 下载搜狐视频电视剧(搜狐电视剧下载安装)
-
搜狐视频APP下载好的视频想要导出到手机相册里方法如下1、打开手机搜狐视频软件,进入搜狐视频后我们点击右上角的“查找”,找到自已喜欢的视频。2、在“浏览器页面搜索”窗口中,输入要下载的视频的名称,然后...
- 永久免费听歌网站(丫丫音乐网)
-
可以到《我爱音乐网》《好听音乐网》《一听音乐网》《YYMP3音乐网》还可以到《九天音乐网》永久免费听歌软件有酷狗音乐和天猫精灵,以前要跳舞经常要下载舞曲,我从QQ上找不到舞曲下载就从酷狗音乐上找,大多...
- 音乐格式转换mp3软件(音乐格式转换器免费版)
-
有两种方法:方法一在手机上操作:1、进入手机中的文件管理。2、在其中选择“音乐”,将显示出手机中的全部音乐。3、点击“全选”,选中所有音乐文件。4、点击屏幕右下方的省略号图标,在弹出菜单中选择“...
- 电子书txt下载(免费的最全的小说阅读器)
-
1.Z-library里面收录了近千万本电子书籍,需求量大。2.苦瓜书盘没有广告,不需要账号注册,使用起来非常简单,直接搜索预览下载即可。3.鸠摩搜书整体风格简洁清晰,书籍资源丰富。4.亚马逊图书书籍...
- 最好免费观看高清电影(播放免费的最好看的电影)
-
在目前的网上选择中,IMDb(互联网电影数据库)被认为是最全的电影网站之一。这个网站提供了各种类型的电影和电视节目的海量信息,包括剧情介绍、演员表、评价、评论等。其还提供了有关电影制作背后的详细信息,...
- 孤单枪手2简体中文版(孤单枪手2简体中文版官方下载)
-
要将《孤胆枪手2》游戏的征兵秘籍切换为中文,您可以按照以下步骤进行操作:首先,打开游戏设置选项,通常可以在游戏主菜单或游戏内部找到。然后,寻找语言选项或界面选项,点击进入。在语言选项中,选择中文作为游...
欢迎 你 发表评论:
- 一周热门
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python写入txt (66)
- python读取文件夹下所有文件 (59)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)
