Класс Python наследует объект

Есть ли причина, по которой объявление класса наследуется от object ?

Я просто нашел код, который делает это, и я не могу найти вескую причину.

 class MyClass(object): # class code follows... 

  • Как получить экземпляр с помощью метода экземпляра?
  • Python создает несколько экземпляров для одного объекта / класса
  • Python: расширение int и MRO для __init__
  • объекты метода против объектов-функций, экземпляры класса Python vs class
  • Для чего нужны метаклассы Python?
  • 7 Solutions collect form web for “Класс Python наследует объект”

    Да, это объект «нового стиля». Это была функция, введенная в python2.2.

    Объекты нового стиля имеют другую объектную модель для классических объектов, а некоторые вещи не будут работать должным образом с объектами старого стиля, например, super (), @property и дескрипторы. См. Эту статью для хорошего описания того, что нового класса стиля:

    http://docs.python.org/release/2.2.3/whatsnew/sect-rellinks.html

    Ссылка SO для описания различий: В чем разница между старым стилем и новыми классами стиля в Python?

    Python 3.x:
    class MyClass(object): = класс нового стиля
    class MyClass: = class MyClass: нового стиля (неявно наследуется от объекта)

    Python 2.x:
    class MyClass(object): = класс нового стиля
    class MyClass: = OLD-STYLE CLASS

    Объяснение:

    При определении базовых классов в Python 3.x вы можете отбросить объект из определения. Тем не менее, это может открыть дверь для серьезного трудного отслеживания проблем …

    Python представила классы нового стиля еще в Python 2.2, и теперь старомодные классы действительно довольно старые. Обсуждение классов старого стиля хранится в документах 2.x и не существует в документах 3.x.

    Проблема в том, что синтаксис для классов старого стиля в Python 2.x такой же, как альтернативный синтаксис для классов нового стиля в Python 3.x. Python 2.x по-прежнему очень широко используется (например, GAE, Web2Py), и любой код (или кодер), невольно привносящий определения класса стиля 3.x в код 2.x, будет в конечном итоге с некоторыми серьезно устаревшими базовыми объектами. И поскольку классы старого стиля не находятся на чьем-либо радаре, они, вероятно, не будут знать, что их поразило.

    Так что просто произнесите его длинным путем и сохраните некоторые 2.x разработчики слез.

    История от Learn Python :

    Первоначальная реализация класса Python была нарушена многими серьезными способами. К тому времени, когда эта ошибка была признана, было уже слишком поздно, и они должны были ее поддержать. Чтобы исправить проблему, им нужен был стиль «нового класса», чтобы «старые классы» продолжали работать, но вы можете использовать новую более правильную версию.

    Они решили, что они будут использовать слово «объект», нижний регистр, чтобы быть «классом», который вы наследуете, чтобы создать класс. Это сбивает с толку, но класс наследует от класса с именем «object», чтобы сделать класс, но он не является объектом на самом деле его классом, но не забывайте наследовать от объекта.

    Также просто, чтобы вы знали, что разница между классами нового стиля и классами старого стиля заключается в том, что классы нового стиля всегда наследуются либо из класса объектов, либо из любого другого класса.

     class NewStyle(object): pass 

    Другой пример:

     class AnotherExampleOfNewStyle(NewStyle): pass 

    В то время как базовый класс в старом стиле выглядит следующим образом:

     class OldStyle(): pass 

    И дочерний класс старого стиля выглядит так:

     class OldStyleSubclass(OldStyle): pass 

    Вы можете видеть, что базовый класс Old Style не наследуется ни от какого другого класса, однако классы Old Style могут, конечно, наследовать друг от друга. Наследование объекта гарантирует, что определенная функциональность доступна в каждом классе Python. Новые классы стиля были введены в Python 2.2

    Да, это исторический . Без его классов старого стиля.

    Если вы используете type() для объекта старого стиля, вы просто получаете «экземпляр». На объекте нового стиля вы получаете свой класс

    Есть ли причина, по которой объявление класса наследуется от object ?

    В Python 3, помимо совместимости между Python 2 и 3, нет . В Python 2, да .

    История Python 2.x:

    В Python 2.x (начиная с версии 2.2) существуют два стиля классов в зависимости от наличия или отсутствия встроенного типа в качестве базового класса:

    1. «классические» классы стиля : у них нет встроенного типа в качестве базового класса:

       >>> class ClassicSpam: # no base class ... pass >>> ClassicSpam.__bases__ () 
    2. «новые» классы стиля : у них есть встроенный тип в качестве базового класса, означающий, что прямо или косвенно они имеют 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'>,) 

    Вне всякого сомнения, при написании класса вы всегда захотите пойти на новые классы. Преимущества для этого многочисленны, чтобы перечислить некоторые из них:

    • Поддержка дескрипторов. classmethod , staticmethod , properties.
    • Порядок разрешения метода (MRO): в каком порядке будут выполняться поиск базовых классов класса при попытке решить, какой метод вызывать.
    • Связано с MRO, super вызовами.

    Одним из недостатков классов нового стиля является то, что сам класс требует большей памяти. Однако, если вы не создаете много объектов класса, я сомневаюсь, что это будет проблемой, и это негативное погружение в море положительных результатов.

    История 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. В противном случае это не имеет никакого значения.

    Синтаксис инструкции создания класса:

     class <ClassName>(superclass): #code follows 

    В отсутствие каких-либо других суперклассов, которые вы специально хотите наследовать, superclass всегда должен быть object , который является корнем всех классов в Python.

    object является технически корнем классов «нового стиля» в Python. Но классы нового стиля сегодня так же хороши, как быть единственным стилем классов.

    Но если вы явно не используете object word при создании классов, то, как упоминалось выше, Python 3.x неявно наследует от суперкласса object . Но я думаю, что явный всегда лучше, чем неявный (ад)

    Справка

    Это создает класс нового стиля .

    Python - лучший язык программирования в мире.