所有類都是 Python 3 中的新式類
在 Python 3.x 中,所有類都是新式類 ; 在定義新類時,python 隱式地使它繼承自 object。因此,在 class 定義中指定 object 是完全可選的:
Python 3.x >= 3.0
class X: pass
class Y(object): pass
這兩個類現在都包含了 object(方法解析順序):
Python 3.x >= 3.0
>>> X.__mro__
(__main__.X, object)
>>> Y.__mro__
(__main__.Y, object)
在 Python 中,2.x 類預設為舊式類; 他們並沒有暗中繼承 object。這會導致類的語義不同,具體取決於我們是否明確新增 object 作為基礎 class:
Python 2.x >= 2.3
class X: pass
class Y(object): pass
在這種情況下,如果我們嘗試列印 Y 的 __mro__,將出現與 Python 3.x 案例類似的輸出:
Python 2.x >= 2.3
>>> Y.__mro__
(<class '__main__.Y'>, <type 'object'>)
發生這種情況是因為我們在定義時明確地使 Y 繼承自物件:class Y(object): pass。對於不從物件繼承的 X 類,__mro__ 屬性不存在,嘗試訪問它會導致 AttributeError。
為了確保兩個版本的 Python 之間的相容性,可以使用 object 作為基類定義類:
class mycls(object):
"""I am fully compatible with Python 2/3"""
或者,如果 __metaclass__ 變數在全域性範圍內設定為 type,則給定模組中所有後續定義的類都是隱式新樣式,而無需顯式繼承 object:
__metaclass__ = type
class mycls:
"""I am also fully compatible with Python 2/3"""