#python #python-3.x
#python #python-3.x
Вопрос:
Каждый класс, который вы создаете в Python, неявно является производным от object
. Чтобы создать новый класс ошибок, вы должны вывести его из BaseException
или из одного из его дочерних классов (обычно Exception
используется для этой цели). Это пользовательское исключение успешно пройдет isinstance(MyException, object)
тест, поэтому оно по-прежнему является object
. Но мне интересно, по какой причине это ограничение было реализовано? Почему нам нужно выводить из BaseException
или его потомков вместо того, чтобы делать так:
class MyException:
pass
raise MyException()
Комментарии:
1. Вероятно, вам не нужно этого делать, но если вы этого не сделаете, вы должны убедиться, что все методы, для реализации которых требуются исключения, реализованы в вашем классе.
2.
BaseException
также является производным отobject
.3. «Каждый класс, который вы создаете в Python, будет неявно производным от object . Исключением из этого правила являются классы, используемые для указания ошибок путем создания исключения. » Абсолютно неверно. * все в Python происходит из
object
. Что создало у вас впечатление иначе?4. Вы явно, а не неявно выводите из них.
5. Как обсуждалось в разделе «В чем причина закрытия вопросов «почему» в языковом дизайне? чтобы быть в теме, вопрос должен касаться конкретной проблемы, с которой вы действительно сталкиваетесь. Если вы не сталкиваетесь с проблемой, вызванной языком, поощряющим исключения, производные от BaseException (и не знаете, как исправить эту проблему!), Это здесь не актуально.
Ответ №1:
raise
для корректной работы требуется несколько специальных атрибутов уровня C (в частности, эти здесь).
Единственный способ получить их в свой объект на чистом python — это подкласс BaseException
. Из-за этого разработчики python просто решили, что каждый вызываемый объект, даже если он определен в модуле C, должен наследоваться от BaseException
, чтобы упростить проверки.