Реализация NoneType, причины и детали

Я недавно где-то читал, что особое значениеNone в Python это объект-одиночка своего класса, в частности,NoneType, Это многое объясняет, так как большинство ошибок, связанных сNone в питоне производятAttributeErrors вместо какого-то особенного "NoneError" или чего-то еще.

Поскольку все этиAttributeErrors отразил атрибуты, которыеNoneType не хватало, меня заинтриговали какие атрибутыNoneType сделал есть, если есть.

Я решил посмотреть на этоNoneType и узнать больше об этом. Я всегда находил, что лучший способ узнать о новой языковой функции - это использовать ее, поэтому я попытался создать экземплярNoneType в бездействии:

>>> n = NoneType()

Это привело к ошибке:

Traceback (most recent call last):
File "<pyshell#0>", line 1, in <module>
    n = NoneType()
NameError: name 'NoneType' is not defined

Смущенный, я осмотрелNone&nbsp;чтобы убедиться, что я правильно понял имя типа. Конечно же,

>>> type(None)
<class 'NoneType'>

Теперь очень смущен, я сделал быстрый поиск в Google. Это показало, чтопо какой-то причине NoneType был каким-то образом удален в Python 3.

Ну, я, хотя, ха-ха! Я могу обойти это, сохраняя типNone&nbsp;в переменной, так какклассы являются объектами в Python.&nbsp;Казалось, это работает:

>>> NoneType = type(None)
>>> n = NoneType()

И когда я напечатал n, я получил почти то, что ожидал:

>>> print(n)
None

Но потом это случилось:

>>> n is None
True

А также:

>>> id(n)
506768776
>>> id(None)
506768776

Моя переменнаяn&nbsp;ЯВЛЯЕТСЯNone, Не только того же типа, что иNone, Это являетсяNone, Это не то, что я ожидал.

Я пытался с помощьюdis&nbsp;чтобы получить больше информации оNoneType, но когда я позвонил

>>> dis.dis(type(None))

Это не произвело никакого выхода.

Затем я попытался расследовать__new__&nbsp;метод, который несколько пользователей упомянули в комментариях:

dis.dis(type(None).__new__)
Traceback (most recent call last):
  File "<pyshell#4>", line 1, in <module>
    dis.dis(type(None).__new__)
  File "C:\Python33\lib\dis.py", line 59, in dis
    type(x).__name__)
TypeError: don't know how to disassemble builtin_function_or_method objects
>>> 

Больше ошибок.

Вот мои вопросы:

Почемуn&nbsp;точно такой же объект, какNone?Почему язык был разработан так, чтоn&nbsp;точно такой же объект, какNone?Как можно реализовать это поведение в python?