Есть ли причина для объявления класса наследоваться от object
?
tl; dr: В Python 3, кроме совместимости между Python 2 и 3, без причины . В Python 2 много причин .
История Python 2.x:
В Python 2.x (начиная с 2.2 и далее) есть два стиля классов в зависимости от наличия или отсутствия object
в качестве базового класса:
"классический" стиль классы: у них нет object
в качестве базового класса:
>>> class ClassicSpam: # no base class
... pass
>>> ClassicSpam.__bases__
()
«новый» стиль классы: они имеют, прямо или косвенно (например, наследуют от встроенного типа ), object
в качестве базового класса:
>>> class NewSpam(object): # directly inherit from object
... pass
>>> NewSpam.__bases__
(<type 'object'>,)
>>> class IntSpam(int): # indirectly inherit from object...
... pass
>>> IntSpam.__bases__
(<type 'int'>,)
>>> IntSpam.__bases__[0].__bases__ # ... because int inherits from object
(<type 'object'>,)
Без сомнения, при написании класса вы всегда захотите перейти на классы нового стиля. Преимущества этого многочисленны, перечислим некоторые из них:
Если вы не наследуете от object
, забудьте об этом. Более полное описание предыдущих пунктов маркировки наряду с другими преимуществами «новых» классов стилей можно найти здесь .
Одним из недостатков классов нового стиля является то, что сам класс требует больше памяти. Если, конечно, вы не создаете много объектов класса, я сомневаюсь, что это будет проблемой, и это будет негативное погружение в море позитива.
История Python 3.x:
В Python 3 все упрощено. Существуют только классы нового стиля (называемые просто классами), поэтому единственное отличие в добавлении object
заключается в том, что вам необходимо ввести еще 8 символов. Это:
class ClassicSpam:
pass
полностью эквивалентно (кроме их имени :-) этому:
class NewSpam(object):
pass
и на это:
class Spam():
pass
Все имеют object
в своих __bases__
.
>>> [object in cls.__bases__ for cls in {Spam, NewSpam, ClassicSpam}]
[True, True, True]
Итак, что вы должны делать?
В Python 2: всегда наследуется от object
явно . Получи льготы.
В Python 3: наследуется от object
, если вы пишете код, который пытается быть независимым от Python, то есть он должен работать как в Python 2, так и в Python 3. В противном случае не , это действительно не имеет значения, так как Python вставляет его вам за кулисы.