2012-04-06 2 views
13

В чем разница между:класса ИмяКласс против класса ClassName (объект)

class ClassName(object): 
    pass 

и

class ClassName: 
    pass 

Когда я вызываю функцию помощи модуля того класса, который вы можете прочитать ____builtin____.object для первый случай под заголовком справки CLASS. Во втором случае он просто показывает имя класса. Существует ли какая-либо функциональная разница между этими классами и/или возможными способами?

(я знаю, что class Classname(ParentClassName) имеет функциональное использование)

+2

Первый класс нового стиля, другой - класс старости. Вы можете посмотреть [этот ответ SO] (http://stackoverflow.com/a/54873/1079354) за приличную разницу между ними. – Makoto

+0

Просто добавьте к нему, хотя вам не нужно делать 'class ClassName (object):' in python3 Я думаю, вы все равно должны это сделать. Его яснее –

+0

Я проверил его. Я не понимаю всех различий, отмеченных в других потоках. Но в этих потоках большинство, похоже, советует использовать новый стиль. Странно, что классы модулей стандартной библиотеки python2.7 используют только старый стиль. (проверьте класс 'Timer 'модуля' timeit', например.) – Bentley4

ответ

2

ClassName(object) использует новый класс стиля: http://docs.python.org/release/2.5.2/ref/node33.html

Второй пример демонстрирует старый класс стиля.

В python 3 по умолчанию используются новые классы стилей, и вам больше не понадобится подкласс object.

15

В Python 2.x, когда вы наследуете «объект», вы являетесь классом «новый стиль», который был реализован обратно в Python 2.2 (около 2001 года) - случай, не наследующий от объекта, создает " старый стиль ", который фактически поддерживался только для обратной совместимости.

Большое преимущество классов «нового стиля» - унификация типов на Python - до этого невозможно было подклассифицировать встроенные типы, такие как int, list, dict, правильно. Был также указан «протокол дескриптора», который описывает протокол для извлечения и установки атрибутов в объекте, что дает языку большую гибкость. (Это более заметно, когда вы используете свойство Python в классе).

В чем разница не на самом деле «наследуется от объекта», но поскольку классы в Python также являются объектами, которые меняют класс classclass (класс class известен как «метакласс»). Таким образом, если вы установите метакласс как «тип», вам не нужно наследовать от объекта, чтобы иметь новый класс стиля.

Он настоятельно рекомендуется, что в Python 2.x, все ваши классы новый стиль - использование старых классов стилей может работать для некоторых отдельных простых случаев, но они могут генерировать много тонких, трудно найти, ошибки , когда вы пытаетесь использовать свойства, рассол, дескрипторы и другие дополнительные функции. Прежде всего, когда вы пытаетесь проверить «тип» объекта, он будет таким же (тип «экземпляр») для всех объектов из классов старого стиля, даже если они из разных классов, определенных пользователем.

В версиях Python 3.x все классы являются новым стилем - не нужно устанавливать метакласс.

документация «DataModel» Python является «книга закона», где поведение обоих класса typs определяется в деталях (достаточно, чтобы один переописать язык):

http://docs.python.org/reference/datamodel.html

Этот блог пост от Гвидо говорит о мотивациях новых классов стиля в более легком языке:

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

http://docs.python.org/release/2.5.2/ref/node33.html

Смежные вопросы