Должны ли все классы Python расширять объект?

Я обнаружил, что обе следующие работы:

class Foo():
    def a(self):
        print "hello"

class Foo(object):
    def a(self):
        print "hello"

Должны ли все классы Python расширять объект? Существуют ли какие-либо потенциальные проблемы с нерасширяющимся объектом?

Ответ 1

В Python 2, не наследующий от object, будет создан класс старого стиля, который, среди других эффектов, вызывает type для получения разных результатов:

>>> class Foo: pass
... 
>>> type(Foo())
<type 'instance'>

против.

>>> class Bar(object): pass
... 
>>> type(Bar())
<class '__main__.Bar'>

Также правила для множественного наследования разные способами, которые я даже не буду пытаться суммировать здесь. Вся хорошая документация, которую я видел о MI, описывает классы нового стиля.

Наконец, классы старого стиля исчезли в Python 3, а наследование от object стало неявным. Поэтому всегда предпочитайте новые классы стиля, если вам не нужна обратная совместимость со старым программным обеспечением.

Ответ 2

В Python 3 классы расширяют object неявно, независимо от того, говорите вы сами или нет.

В Python 2 есть классы старого стиля и нового стиля. Чтобы сигнализировать, что класс является новым, вы должны явно наследовать от object. Если нет, используется реализация старого стиля.

Обычно вам нужен класс нового стиля. Наследовать от object явно.

Ответ 3

В python 3 вы можете создать класс тремя разными способами, и внутри они все равны (см. примеры). Неважно, как вы создаете класс, все классы в python 3 наследуются от специального класса object. Класс объект является фундаментальным классом в python и предоставляет множество функций, таких как методы с двойным подчеркиванием, дескрипторы, метод super(), метод property() и т.д.

Пример 1.

class MyClass:
 pass

Пример 2.

class MyClass():
 pass

Пример 3.

class MyClass(object):
  pass

Ответ 4

Да, все классы Python должны расширять (или, скорее, подкласс, это объект Python здесь). Хотя обычно серьезных проблем не возникает, в некоторых случаях (как и с несколькими деревьями наследования) это будет иметь важное значение. Это также обеспечивает лучшую совместимость с Python 3.

Ответ 5

в python3 нет разницы, но в python2 не расширяющийся object дает вам классы старого стиля; вы хотели бы использовать класс нового стиля в классе старого стиля.