8
A
回答
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中,默認情況下它將被視爲新的樣式類。
相關問題
- 1. Doctrine2 + Symfony2的默認繼承
- 2. 的JavaScript繼承的屬性默認值
- 3. C#中的默認繼承類型
- 4. 的Java 8默認方法繼承
- 5. 具有默認參數的類繼承
- 6. Java繼承:嚴格的默認抽象和默認默認的衝突規範
- 7. 的Python:變量,繼承和默認參數
- 8. Python副本:如何繼承默認的複製行爲?
- 9. PHP - 繼承功能默認值
- 10. 骨幹類模型不繼承默認
- 11. SVG內聯 - 默認或繼承高度
- 12. .Net繼承控件屬性默認值
- 13. C++繼承功能默認操作
- 14. 繼承logging.Formatter更改默認行爲logging.Formatter
- 15. 默認值與單表繼承
- 16. Winform繼承和默認表單大小
- 17. 多級繼承默認構造
- 18. 沒有默認構造函數 - 繼承
- 19. 從默認樣式繼承樣式
- 20. Python:孩子繼承父母默認值,如果未指定
- 21. 繼承Python類繼承docstrings
- 22. Python的繼承
- 23. 不承認C++繼承
- 24. C++繼承不承認類
- 25. Python忽略提供給繼承類中的元組的參數的默認值
- 26. Python類繼承
- 27. Python 3繼承
- 28. Python:類繼承
- 29. 繼承在Python
- 30. Python中的繼承
關於`object`和舊vs新類的所有答案都是正確的,但你爲什麼要問?是否有實際的理由,還是僅僅是一個哲學/語言設計問題? (因爲在大多數情況下,沒關係!) – 2011-02-05 10:16:17