Python super()使用注意事项(包含新式类和旧式类的区别)

前面已经讲解了 super() 函数的用法,值得一提的是,Python 2 中 super() 函数的用法和 Python 3 大致相同,唯一的区别在于,Python 2 中不能使用零参数形式的格式,必须提供至少一个参数。

对于想要编写跨版本兼容代码的程序员来说,还要注意一件事,即 Python 2 中的 super() 函数只适用于新式类,在旧式类中不能使用 super()。

那么,什么是旧式类和新式类呢?在早期版本的 Python 中,所有类并没有一个共同的祖先 object,如果定义一个类,但没有显式指定其祖先,那么就被解释为旧式类,例如:
class oldStyle1:
  pass
class oldStyle2:
  pass
其中,oldStyle1 和 oldStyle2 都属于旧式类。

Python 2.x 版本中,为了向后兼容保留了旧式类。该版本中的新式类必须显式继承 object 或者其他新式类:
class newStyleClass(object):
  pass
class newStyleClass(newStyleClass):
  pass
显然,以上两个类都属于新式类。

而在 Python 3.x 版本中,不再保留旧式类的概念。因此,没有继承任何其他类的类都隐式地继承自 object。

可以说,在 Python 3.x 中,显式声明某个类继承自 object 似乎是冗余的。但如果考虑跨版本兼容,那么就必须将 object 作为所有基类的祖先,因为如果不这么做的话,这些类将被解释为旧式类,最终会导致难以诊断的问题。

推荐文章
C++指针作为函数参数(详解版)

《函数引用传递》一节,我们介绍了用作函数形参的引用变量,引用变量其实就是原始变量的别名,该原始变量用作实参。这样的设计使得函数可以访问原始实参变量,从而允许它更改变量的内容。当为一个变量传入一个引用形

WSAStartup()函数以及DLL的加载

本节讲解Windows下DLL的加载,学习LinuxSocket的读者可以跳过。 WinSock(WindowsSocket)编程依赖于系统提供的动态链接库(DLL),有两个版本: 较早的DLL

在windows中,alt+tab键的作用是什么?

在windows中,【Alt+Tab】键是切换窗口的快捷键,可以实现应用程序之间相互切换。当有多个应用程序窗口同时打开时,Alt+Tab可以方便的进行应用程序之间的切换。windows实现窗口切换的方

divx格式是什么?

divx格式是一种视频格式,是由MPEG-4衍生出的另一种视频编码(压缩)标准,也即我们通常所说的DVDrip格式。divx格式采用了MPEG4的压缩算法同时又综合了MPEG-4与MP3各方面的技术,

Python list列表使用技巧及注意事项

前面章节介绍了很多关于list列表的操作函数,细心的读者可能会发现,有很多操作函数的功能非常相似。例如,增加元素功能的函数有append()和extend(),删除元素功能的有clear()、remo

C++ is_sorted()函数完全攻略

我们知道,排序操作是比较耗费时间的,尤其当数据量很大的时候。因此在设计程序时,我们应该有意识的去避免执行一些不必要的排序操作。 那么,何谓不必要的排序操作呢?举个例子,有这样一组数据: 12345

C++ STL无序容器底层实现原理(深度剖析)

在阅读本节内容之前,读者需了解哈希表存储结构的原理,可猛击《哈希表(散列表)详解》一节。 在了解哈希表存储结构的基础上,本节将具体分析C++STL无序容器(哈希容器)底层的实现原理。 C++S

lenovo utility是什么软件?

LenovoUtility是由Lenovo官方推出的用于在发生WER(Windows错误报告)事件时从Lenovo服务器搜索、下载和安装补丁的应用程序软件。该软件提供了云端补丁升级的功能,所有的len

Python函数参数传递机制(超级详细)

Python中,函数参数由实参传递给形参的过程,是由参数传递机制来控制的。通过学习《Python函数值传递和引用传递》一节我们知道,根据实际参数的类型不同,函数参数的传递方式分为值传递和引用传递(又称

Shell配置文件(脚本)的加载

无论是否是交互式,是否是登录式,BashShell在启动时总要配置其运行环境,例如初始化环境变量、设置命令提示符、指定系统命令路径等。这个过程是通过加载一系列配置文件完成的,这些配置文件其实就是She

PHP删除、复制、重命名文件

在对文件进行操作时,不仅可以对文件中的数据进行操作,还可以对文件本身进行作。例如复制文件、删除文件、截取文件及为文件重命名等操作。在PHP中为我们提供了这些文件处理方式的标准函数,使用也非常简便。

feof和ferror函数,C语言feof和ferror函数详解

正如前面所讲,fgetc(或者getc)函数返回EOF并不一定就表示文件结束,读取文件出错时也会返回EOF。即EOF宏不但能够表示读到了文件结尾这一状态,而且还能表示I/O操作中的读、写错误以及其他一

互联网系统应用架构基础分析

在互联网系统中包含许多的工具,每个企业都有自己的架构,正如没有完美的程序一样,也不会有完美的架构。本节分析的架构严格来说并不严谨,但是却包含了互联网的思想,互联网架构如图1所示。 图1  互联网架

先忘记框架:理解响应式设计的基础知识

这听起来像是一项艰巨的任务。我们有像Bootstrap和Foundation这样的CSS和JavaScript框架为我们解决所有这些问题,对吧?好吧,也许吧。现在,不要误解我的意思-我认为框架是很棒的

C语言指针数组(数组每个元素都是指针)详解

如果一个数组中的所有元素保存的都是指针,那么我们就称它为指针数组。指针数组的定义形式一般为: dataType*arrayName[length]; []的优先级高于*,该定义形式应该理解为: d

C语言枚举类型(C语言enum用法)详解

在实际编程中,有些数据的取值往往是有限的,只能是非常少量的整数,并且最好为每个值都取一个名字,以方便在后续代码中使用,比如一个星期只有七天,一年只有十二个月,一个班每周有六门课程等。 以每周七天为例

什么叫编程?什么人能学编程?

什么叫编程?编程是编定程序的中文简称,就是让计算机代为解决某个问题,对某个计算体系规定一定的运算方式,使计算体系按照该计算方式运行,并最终得到相应结果的过程。为了使计算机能够理解人的意图,人类就必须将

爬虫一般采用什么代理ip?

爬虫是现在最流行也是最好用的信息采集工具,一提到爬虫我们都绕不过代理IP这个话题,这是为什么呢?因为爬虫在采集信息的过程中,会在短时间内发出大量请求,占用服务器的带宽,影响正常用户的访问,严重的还会导

PHP preg_grep():检测与给定模式匹配的数组元素

使用正则表达式除了可以匹配字符串外,还可以匹配数组中的元素。PHP中的preg_grep()函数可以搜索数组中的所有元素,并返回与正则表达式匹配的所有元素所组成的数组,函数的语法格式如下: preg

Shell if else语句(详解版)

和其它编程语言类似,Shell也支持选择结构,并且有两种形式,分别是ifelse语句和casein语句。本节我们先介绍ifelse语句,casein语句将会在《Shellcasein》中介绍。 如果