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

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

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

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

7 ответов


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

tl; dr: в Python 3, помимо совместимости между Python 2 и 3, незачем. В Python 2, много причин.


Python 2.х история:

В Python 2.x (начиная с 2.2) существует два стиля классов в зависимости от наличия или отсутствия object как базовый класс:

  1. "классическом" стиле классы: у них нет object как базовый класс:

    >>> class ClassicSpam:      # no base class
    ...     pass
    >>> ClassicSpam.__bases__
    ()
    
  2. "новый" стиль классы: у них есть, непосредственно или косвенно (e.g наследуется от A встроенного типа), 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'>,)
    

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

  • поддержка дескрипторов. В частности, с помощью дескрипторов становятся возможными следующие конструкции:

    1. classmethod: метод, который получает класс в качестве неявного аргумента вместо экземпляра.
    2. staticmethod: метод, который не получает неявный аргумент self в качестве первого аргумент.
    3. свойства property: создание функций для управления получением, установкой и удалением атрибута.
    4. __slots__: сохраняет потребление памяти класса, а также приводит к более быстрому доступу атрибутов. Конечно, делает!--83-->ограничения.
  • на __new__ статический метод: позволяет настроить способ создания новых экземпляров класса.

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

  • связанные с MRO,super звонки. Также смотрите,super() считается супер.

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

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


Python 3.х история:

в 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 вставляет его для вас за кулисами.


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

Python 2.x:
class MyClass(object): = новый стиль класс
class MyClass: = КЛАСС СТАРОГО СТИЛЯ

объяснение:

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

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

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

так что просто произнести его длинный путь и сохранить некоторые 2.x проявитель слезы.


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

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

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


история узнайте Python трудный путь:

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

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

также просто, чтобы вы знали, в чем разница между классами нового стиля и классами старого стиля, это то, что классы нового стиля всегда наследуются от object class или из другого класса, унаследованного от object:

class NewStyle(object):
    pass

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

class AnotherExampleOfNewStyle(NewStyle):
    pass

пока старый стиль базовый класс выглядит так:

class OldStyle():
    pass

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

class OldStyleSubclass(OldStyle):
    pass

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


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

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


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

class <ClassName>(superclass):
    #code follows

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

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

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

ссылка


Это создает новый стиль класс.