2011-09-11 57 views
63

我試圖將一些python代碼轉換爲scala代碼。所以我是一個Python的總noob。以對象作爲參數的類

但爲什麼有些類有對象作爲參數,但從來沒有明確使用它?首先將它作爲參數的理由是什麼?

例子:

class Table(object) 

謝謝您的時間。

+0

[Python中的舊風格和新風格類]可能的重複(http://stackoverflow.com/questions/54867/old-style-and-new-style-classes-in-python) – JBernardo

回答

68

在Python2中,它聲明Tablenew-style class(與「經典」類相對)。 在Python3中,所有的類都是新式類,所以這不再是必需的。

新風格類有一些經典類缺乏的特殊屬性。

class Classic: pass 
class NewStyle(object): pass 

print(dir(Classic)) 
# ['__doc__', '__module__'] 

print(dir(NewStyle)) 
# ['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__'] 

此外,propertiessuper不與經典類的工作。

在Python2中,創建所有類的新樣式類是一個不錯的主意。 (雖然在標準庫大量類仍然經典類,向後兼容的需要。)

通常,在諸如

class Foo(Base1, Base2): 

Foo被聲明爲類聲明中繼承自基類Base1Base2

object是Python中所有類的母親。這是一種新式的課程,因此從object繼承,使Table成爲一種新式課程。

+0

你可以將我重定向到一個源,提到對象是不必要的參數在Python3中?我似乎無法找到它。謝謝 –

+1

在StackOverflow([這裏,例如](https://stackoverflow.com/a/16193572/190597))上已經提到過很多次,但是我一直沒有能夠在文檔。它隱含地顯示出來了(通過在類的基礎列表中省略'object')[在教程中](https://docs.python.org/3/tutorial/classes.html#class-definition-syntax)。 – unutbu

+1

[Python3文檔](https://docs.python.org/3/glossary.html#term-new-style-class)也聲明「新風格類」是「風格的舊名稱」類**現在用於所有類對象**「(我強調)。並且[Python2文檔狀態](https://docs.python.org/2/glossary.html#term-new-style-class)「新風格的類」是從「object」繼承的任何類。這兩個語句放在一起意味着你不需要在Python3的類庫列表中包含'object',因爲所有的類都是Python3中的新類。 – unutbu

14

Table該課程正在擴展名爲object的課程。這不是一個爭論。你可能想明確地擴展object的原因是它把這個類變成了一個新風格的類。如果你沒有明確指定它擴展爲object,直到Python 3,它將默認爲一箇舊式類。 (從Python 3開始,所有類都是全新的,無論您是否明確地擴展了object)。

有關新式和舊式類的更多信息,請致電see this question

+1

這是更多簡潔明瞭的答案。謝謝。 – Sabuncu

2

class Table和class Table(object)對於Python來說沒有什麼不同。

它不是一個參數,它是從對象(與許多其他語言一樣是基類)擴展而來的。

它所說的只是它繼承了「對象」中定義的任何東西。這是默認行爲。

+3

自動擴展'object'的類只是Python 3中的默認行爲。在python 2中,類擴展對象具有一個不擴展對象的類不會擁有的屬性。 –

1

剛一說明,「新風格」與‘舊風格’的等級區分是針對Python 2.x的;在3.x中,所有的類都是‘新式’

0

1)。類名(object):2)類名: 它們都是相同的,但在寫作方面第一個更好,在繼承其他類到另一個類時它看起來更好,它看起來是同類的。

如何相同? 所以,Python中的每一件事都是在對象的意義下意味着Python中的每一件事物都具有對象的屬性,如果寫或不理解它。首先,我們明確地告訴它,其次我們不知道。

+0

Python 2中不是這種情況,請參閱接受的答案以瞭解詳細信息。 – niemmi

0

對象是python中定義的類對象的最基類型。對象的屬性 可以看出如下

** >>> DIR(對象)

[ '', 'delattr', 'DOC', '格式' '的getAttribute', '哈希', '初始化', '', '減少','reduce_ex ' '再版', 'SETATTR', '的sizeof', 'STR',' subclasshook「] **

所以表(對象)是剛剛繼承。 !