游戏开发工具

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 作为所有基类的祖先,因为如果不这么做的话,这些类将被解释为旧式类,最终会导致难以诊断的问题。