Почему классы Python наследуют объект?
Почему следующее объявление класса наследуется от object
?
class MyClass(object):
...
Переведено автоматически
Ответ 1
Есть ли какая - либо причина для наследования объявления класса от
object
?
В 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'>,)
Без сомнения, при написании класса вам всегда захочется использовать классы нового стиля. Преимуществ такого подхода множество, вот лишь некоторые из них:
Поддержка дескрипторов. В частности, с помощью дескрипторов становятся возможными следующие конструкции:
classmethod
: Метод, который получает класс в качестве неявного аргумента вместо экземпляра.staticmethod
: Метод, который не принимает неявный аргументself
в качестве первого аргумента.- свойства с помощью
property
: Создайте функции для управления получением, установкой и удалением атрибута. __slots__
: Экономит потребление памяти классом, а также приводит к более быстрому доступу к атрибутам. Конечно, это накладывает ограничения.
__new__
Статический метод: позволяет настроить способ создания новых экземпляров класса.Порядок разрешения методов (MRO): в каком порядке будет выполняться поиск в базовых классах класса при попытке решить, какой метод вызывать.
Связанные с MRO,
super
вызовы. Также смотрите,super()
считается супер.
Если вы не наследуете от 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 вставляет это для вас за кулисами.
Ответ 2
Python 3
class MyClass(object):
= Класс в новом стилеclass MyClass:
= Класс нового стиля (неявно наследуется отobject
)
Python 2
class MyClass(object):
= Класс в новом стилеclass MyClass:
= КЛАСС СТАРОГО СТИЛЯ
Объяснение:
При определении базовых классов в Python 3.x вам разрешается исключить object
из определения. Однако это может привести к серьезной проблеме, которую трудно отследить.…
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 от лишних слез.
Ответ 3
Да, это объект "нового стиля". Это была функция, представленная в python2.2.
Объекты нового стиля имеют объектную модель, отличную от классических объектов, и некоторые вещи не будут работать должным образом с объектами старого стиля, например, super()
, @property
и дескрипторами. Смотрите Эту статью, чтобы получить хорошее описание того, что такое класс нового стиля.
ИТАК, ссылка для описания различий: В чем разница между классами старого стиля и классами нового стиля в Python?
Ответ 4
История из Learn Python the Hard Way:
Первоначальная интерпретация класса в Python была нарушена многими серьезными способами. К тому времени, когда эта ошибка была обнаружена, было уже слишком поздно, и им пришлось ее поддерживать. Чтобы устранить проблему, им нужен был какой-то стиль "нового класса", чтобы "старые классы" продолжали работать, но вы можете использовать новую, более правильную версию.
Они решили, что будут использовать слово "object" в нижнем регистре как "класс", от которого вы наследуете, чтобы создать класс. Это сбивает с толку, но класс наследует от класса с именем "object", чтобы создать класс, но на самом деле это не объект, а класс, но не забудьте наследовать от object .
Также, чтобы вы знали, в чем разница между классами нового стиля и классами старого стиля, это то, что классы нового стиля всегда наследуются от object
class или от другого класса, унаследованного от object
:
class NewStyle(object):
pass
Другой пример:
class AnotherExampleOfNewStyle(NewStyle):
pass
В то время как базовый класс старого стиля выглядит следующим образом:
class OldStyle():
pass
И дочерний класс старого стиля выглядит следующим образом:
class OldStyleSubclass(OldStyle):
pass
Вы можете видеть, что базовый класс старого стиля не наследуется ни от какого другого класса, однако классы старого стиля, конечно, могут наследовать друг от друга. Наследование от object гарантирует, что определенная функциональность доступна в каждом классе Python. В Python 2.2 были представлены классы нового стиля