В 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
Первый класс нового стиля, другой - класс старости. Вы можете посмотреть [этот ответ SO] (http://stackoverflow.com/a/54873/1079354) за приличную разницу между ними. – Makoto
Просто добавьте к нему, хотя вам не нужно делать 'class ClassName (object):' in python3 Я думаю, вы все равно должны это сделать. Его яснее –
Я проверил его. Я не понимаю всех различий, отмеченных в других потоках. Но в этих потоках большинство, похоже, советует использовать новый стиль. Странно, что классы модулей стандартной библиотеки python2.7 используют только старый стиль. (проверьте класс 'Timer 'модуля' timeit', например.) – Bentley4