2013-08-20 3 views
4

Когда класс унаследован от ничего, у меня есть объект типа экземпляра.Почему наследование от объекта имеет значение в Python?

>>> class A(): pass; 
>>> a = A() 
>>> type(a) 
<type 'instance'> 
>>> type(a) is A 
False 
>>> type(A) 
<type 'classobj'> 

Однако, когда у меня есть тот же класс, наследующий от объекта, создаваемый объект типа А.

>>> class A(object): pass; 
>>> a = A() 
>>> type(a) 
<class '__main__.A'> 
>>> type(a) is A 
True 
>>> type(A) 
<type 'type'> 

Какова логика этого? Означает ли это, что каждый класс должен наследовать от объекта?

+0

также тесно связаны: [Старый стиль и новые классы стилей в Python] (http://stackoverflow.com/q/54867) –

ответ

7

В Python 3, те две такие же , В Python 2, однако:

class A: pass # old-style class 

class B(object): pass # new-style class 

С New-style and classic classes в документации:

до Python 2.1, классы старого стиля были только ароматы доступны пользователю. Концепция (старый стиль) класс не имеет никакого отношения к понятию типа: если x является экземпляром класса старого стиля, то x.__class__ обозначает класс x, но type(x) всегда <type 'instance'>. Это отражает тот факт, что все экземпляры старого стиля, независимо от их класса, реализованы с помощью одного встроенного типа, называемого экземпляром.

Классы нового стиля были введены в Python 2.2 для унификации классов и типов. Класс нового стиля не больше и не меньше пользовательского типа. Если x является экземпляром класса нового стиля, то type(x) - это то же самое, что и x.__class__.

Основная мотивация для введения классов нового стиля - предоставить единую объектную модель с полной метамоделью. Он также имеет ряд непосредственных преимуществ, таких как возможность подкласса большинства встроенных типов или введение «дескрипторов», которые позволяют вычислять свойства.

По этим причинам рекомендуется использовать классы нового стиля, когда это возможно. Единственная причина, по которой старые классы стиля существуют даже в Python 2.2+, - это обратная совместимость; в Python 3 были удалены классы старого стиля.

+1

Хороший ответ.Я собирался предложить добавить что-то вроде «Единственная причина когда-либо использовать классы старого стиля - это когда вы звоните в какую-то древнюю библиотеку, которая требует от вас« экземпляра '' '' '' s, но ваше последнее редактирование прекрасно освещало это. – abarnert

0

это объясняет instance вещь:

>>> class A(): pass; 
>>> A 
<class __main__.A at 0x7f879998b050> 
>>> A()            
<__main__.A instance at 0x7f87999a83b0> 

но вы не должны использовать type() для сравнения объектов в Python в любом случае, вы должны использовать isinstance()

1

Исходная реализация пользовательских классов в Python всасывается. 2.2 исправили его, но им пришлось сохранить прежнюю систему для обратной совместимости. Таким образом, Python имеет 2 типа классов, «классический» и «новый». Все, что наследуется от object (прямо или косвенно), является новым; все, что не является классическим. Каждый класс, который вы пишете, должен каким-то образом наследовать объект, либо напрямую, если у него нет других родителей, или косвенно, потому что он наследует от другого класса нового стиля (или встроенного типа).

См http://python-history.blogspot.com/2010/06/new-style-classes.html