所有類都是 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"""