2011-02-05 100 views
8

如果我定義Python中的類如:Python的默認繼承?

class AClass: 
    __slots__ = ['a', 'b', 'c'] 

它繼承哪一類?它似乎不會從object繼承。

+0

關於`object`和舊vs新類的所有答案都是正確的,但你爲什麼要問?是否有實際的理由,還是僅僅是一個哲學/語言設計問題? (因爲在大多數情況下,沒關係!) – 2011-02-05 10:16:17

回答

11

如果您定義了一個類並且不聲明任何特定的父類,則該類將成爲「經典類」,其行爲與「從對象繼承的」新類「的行爲有點不同。在這裏看到更多的細節:http://docs.python.org/release/2.5.2/ref/node33.html

經典類沒有共同的根,所以基本上,你的AClass不從任何類繼承。

請注意,這是特定於3.0版之前的Python版本。在Python 3中,如果沒有聲明其他父類,則所有類都是新類,並從對象隱式地繼承。

2

在Python 2.x或更舊版本中,您的示例AClass是「舊式」類。

「新風格」類具有已定義的繼承,並且必須從對象或其他類繼承。

What is the difference between old style and new style classes in Python?

編輯:哇,我不認爲這是可以使用在Python 3.x的舊樣式語法但我只是試了一下,而且語法仍然有效。但你得到一個新式的課程。

2

讓我們試試吧。

>>> class AClass: 
...  pass 
... 
>>> AClass.__bases__, type(AClass) 
((), <type 'classobj'>)    # inherits from nothing 

>>> class AClass(object):    # new style inherits from object 
...  pass 
... 
>>> AClass.__bases__, type(AClass) 
((<type 'object'>,), <type 'type'>) 

閱讀其他答案中給出的鏈接中的新樣式類的介紹。

8

試試下面的代碼片段在Python 2.7和Python 3.1

class AClass: 
    __slots__ = ['a', 'b', 'c'] 
print(type(AClass)) 
print(issubclass(AClass,object)) 
print(isinstance(AClass,type)) 

在Python 2.7,你會得到:

<type 'classobj'> 
False 
False 

和Python 3.1,你會得到。

<class type> 
True 
True 

這就解釋了一切。這是Python 2中的舊式類,除非您從object中繼承它。只有在Python3中,默認情況下它將被視爲新的樣式類。