Должны ли все классы 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
дает вам классы старого стиля; вы хотели бы использовать класс нового стиля в классе старого стиля.