Implementierung von NoneType, Gründen und Details

Ich habe kürzlich irgendwo gelesen, dass der besondere WertNone in python ist speziell ein singleton-objekt seiner eigenen klasseNoneType. Das hat viel erklärt, da die meisten Fehler involviert sindNone in Python produzierenAttributeErrors statt eines speziellen "NoneError" oder so.

Da alle dieseAttributeErrors spiegelte die Attribute, dieNoneType fehlte, wurde ich von welchen Eigenschaften fasziniertNoneType tat haben, wenn überhaupt.

Ich beschloss, das zu untersuchenNoneType und erfahre mehr darüber. Ich habe immer herausgefunden, dass es der beste Weg ist, etwas über eine neue Sprachfunktion zu lernen, sie zu verwenden. Deshalb habe ich versucht, sie zu instanziierenNoneType im LEERLAUF:

>>> n = NoneType()

Dies verursachte einen Fehler:

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

Verwirrt inspizierte ichNone um zu sehen, ob ich den richtigen Typnamen gefunden habe. Sicher genug,

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

Jetzt sehr verwirrt, habe ich eine schnelle Google-Suche durchgeführt. Dies ergab, dassAus irgendeinem Grund wurde NoneType in Python 3 entfernt.

Nun ich aber, ha ha! Ich kann das umgehen, indem ich den Typ von speichereNone in einer Variablen, daKlassen sind Objekte in Python. Das schien zu funktionieren:

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

Und als ich n druckte, bekam ich ziemlich genau das, was ich erwartet hatte:

>>> print(n)
None

Aber dann passierte folgendes:

>>> n is None
True

Und:

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

Meine Variablen ISTNone. Nicht nur der gleiche Typ wieNone. Es istNone. Das habe ich nicht erwartet.

Ich habe versucht mitdis um mehr Informationen zu erhaltenNoneType, aber als ich anrief

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

Es wurde keine Ausgabe erzeugt.

Ich habe dann dann versucht das zu untersuchen__new__ Methode, die mehrere Benutzer in den Kommentaren erwähnt hatten:

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
>>> 

Weitere Fehler.

Hier sind meine Fragen:

Warum istn das exakt gleiche Objekt wieNone?Warum wurde die Sprache so gestaltet, dassn ist genau das gleiche Objekt wieNone?Wie würde man dieses Verhalten überhaupt in Python umsetzen?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage