簡體   English   中英

Python中類foo和類foo(對象)之間的區別

[英]Difference between class foo and class foo(object) in Python

我知道class foo(object)是一種定義類的舊式學習方式。 但我想更詳細地了解這兩者之間的區別。

在python 2.2之前,基本上有兩種不同類型的類:由C擴展和C編碼內置(類型)定義的類和由python類語句(類)定義的類。 當你想混合python-types和內置類型時,這會導致問題。 最常見的原因是子類化。 如果你想在python代碼中繼承列表類型,那你就運氣不好,因此使用了各種變通方法,比如子類化列表的純python實現(在UserList模塊中)。

這是一個相當難看的,所以在2.2中有一個統一python和內置類型的舉動 ,包括從它們繼承的能力。 結果是“新風格”。 這些與舊式類有一些不兼容的差異,因此對於向后兼容性,裸類語法創建舊式類,而新行為是通過從對象繼承獲得的。 最明顯的行為差異是:

  • 方法解析順序(MRO)。 菱形繼承層次結構中的行為存在差異(其中A繼承自B和C,它們都從公共基類D繼承。以前,方法從左到右查找,深度優先(即ABDCD)但是如果C重載了D的一個成員,它將不會被A使用(因為它首先發現D的實現)這對於各種編程風格(例如使用mixin類)是不好的。新樣式類將這種情況視為ABCD, (查看類的__mro__屬性以查看它將搜索的順序)

  • 添加了__new__構造函數,它允許類充當工廠方法,而不是返回類的新實例。 用於返回特定子類,或重用不可變對象而不是創建新對象而無需更改創建接口。

  • 描述符 這些是屬性,類方法,靜態方法等背后的特征。本質上,它們提供了一種方法來控制在(新樣式)類上訪問或設置特定屬性時發生的事情。

class foo(object):是聲明類的'新'方式。

這個更改是在python 2.2中進行的,請參閱此PEP以了解差異的解釋

子類化object產生一個新式的類。 新式課程的兩個眾所周知的優點是:

  • 元類(類工廠,但透明地工作)
  • 屬性(getter&setters ...)

引用這個類Foo(object)中的對象是為了使你的python 3代碼與python 2和3兼容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM