Python super()使用注意事项(包含新式类和旧式类的区别)
前面已经讲解了 super() 函数的用法,值得一提的是,Python 2 中 super() 函数的用法和 Python 3 大致相同,唯一的区别在于,Python 2 中不能使用零参数形式的格式,必须提供至少一个参数。
对于想要编写跨版本兼容代码的程序员来说,还要注意一件事,即 Python 2 中的 super() 函数只适用于新式类,在旧式类中不能使用 super()。
那么,什么是旧式类和新式类呢?在早期版本的 Python 中,所有类并没有一个共同的祖先 object,如果定义一个类,但没有显式指定其祖先,那么就被解释为旧式类,例如:
Python 2.x 版本中,为了向后兼容保留了旧式类。该版本中的新式类必须显式继承 object 或者其他新式类:
而在 Python 3.x 版本中,不再保留旧式类的概念。因此,没有继承任何其他类的类都隐式地继承自 object。
可以说,在 Python 3.x 中,显式声明某个类继承自 object 似乎是冗余的。但如果考虑跨版本兼容,那么就必须将 object 作为所有基类的祖先,因为如果不这么做的话,这些类将被解释为旧式类,最终会导致难以诊断的问题。
对于想要编写跨版本兼容代码的程序员来说,还要注意一件事,即 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 作为所有基类的祖先,因为如果不这么做的话,这些类将被解释为旧式类,最终会导致难以诊断的问题。
所有教程
- socket
- Python基础教程
- C#教程
- MySQL函数
- MySQL
- C语言入门
- C语言专题
- C语言编译器
- C语言编程实例
- GCC编译器
- 数据结构
- C语言项目案例
- C++教程
- OpenCV
- Qt教程
- Unity 3D教程
- UE4
- STL
- Redis
- Android教程
- JavaScript
- PHP
- Mybatis
- Spring Cloud
- Maven
- vi命令
- Spring Boot
- Spring MVC
- Hibernate
- Linux
- Linux命令
- Shell脚本
- Java教程
- 设计模式
- Spring
- Servlet
- Struts2
- Java Swing
- JSP教程
- CSS教程
- TensorFlow
- 区块链
- Go语言教程
- Docker
- 编程笔记
- 资源下载
- 关于我们
- 汇编语言
- 大数据
- 云计算
- VIP视频