Python super()使用注意事項(包含新式類和舊式類的區別)

2020-07-16 10:05:04
前面已經講解了 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 作為所有基礎類別的祖先,因為如果不這麼做的話,這些類將被解釋為舊式類,最終會導致難以診斷的問題。