Почему это необходимо для подкласса из объекта в Python?
Я уже давно использую Python, и я до сих пор не уверен, почему вы должны подклассы из object
. В чем разница между ними:
class MyClass():
pass
И это:
class MyClass(object):
pass
Насколько я понимаю, object
- это базовый класс для всех классов, и подразумевается подклассификация. Вы получаете что-либо от явного подкласса от него? Какая самая "питоническая" вещь?
Ответы
Ответ 1
Это старые и новые классы стиля в python 2.x. Вторая форма - это обновленная версия и существует от python 2.2 и выше. Для нового кода вы должны использовать только новые классы стиля.
В Python 3.x вы можете снова использовать обе формы равнодушно, так как новый стиль остается единственным, и обе формы действительно эквивалентны. Однако я считаю, что вы должны продолжать использовать форму MyClass(object)
даже для кода 3.x, по крайней мере, до тех пор, пока python 3.x не будет широко принят, чтобы избежать недоразумений с потенциальными читателями вашего кода, используемого для 2.x.
Поведение между старым стилем и новыми классами стилей очень отличается от некоторых функций, таких как использование super().
Смотрите здесь: Новые классы стиля
Вы также можете увидеть здесь на SO.
Ответ 2
согласен с @kriss, @Noctis и @Carson. больше цвета от меня:
class X: pass
и class X(): pass
являются синонимами для классических классов, тогда как
class X(object): pass
для классов нового стиля, как вы можете видеть здесь:
>>> class X:pass
...
>>> class Y(): pass
...
>>> class Z(object): pass
...
>>>
>>> type(X), type(Y), type(Z)
(<type 'classobj'>, <type 'classobj'>, <type 'type'>)
посмотрите на ссылку, предоставленную @kriss, для более подробной информации о различиях. что недействительно в Python 3 - это концепция классического класса... причина в том, что классические классы устарели. все три идиомы создают только классы нового стиля в любом 3.x:
>>> class X:pass
...
>>> class Y(): pass
...
>>> class Z(object): pass
...
>>>
>>> type(X), type(Y), type(Z)
(<class 'type'>, <class 'type'>, <class 'type'>)
что это означает, что нижняя линия? если вы кодируете Python 2, старайтесь как можно больше использовать классы нового стиля. таким образом, вы уже создали свой путь миграции. плюс классы нового стиля предлагают больше возможностей, чем классические классы. (это несколько субъективно, но если ваши [классические] классы относительно просты, то, возможно, вам не нужно ничего делать, чтобы заставить их работать на Python 3.)