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