我最近在某处读到,None
python 中的特殊值是它自己类的单例对象,特别是NoneType
. 这解释了很多,因为涉及None
python 的大多数错误都会产生AttributeError
s 而不是一些特殊的“NoneError”或其他东西。
由于所有这些都AttributeErrors
反映了所NoneType
缺乏的属性,因此我对NoneType
确实具有的属性(如果有的话)产生了兴趣。
我决定对此进行调查NoneType
并了解更多信息。我一直发现了解新语言功能的最佳方法是使用它,因此我尝试NoneType
在 IDLE 中进行实例化:
>>> n = NoneType()
这产生了一个错误:
Traceback (most recent call last):
File "<pyshell#0>", line 1, in <module>
n = NoneType()
NameError: name 'NoneType' is not defined
很困惑,我检查None
了我是否得到了正确的类型名称。果然,
>>> type(None)
<class 'NoneType'>
现在很困惑,我做了一个快速的谷歌搜索。这表明出于某种原因 NoneType 在 Python 3 中以某种方式被删除。
好吧,我虽然,哈哈!None
我可以通过将类型存储在变量中来解决这个问题,因为类是 python 中的对象。这似乎有效:
>>> NoneType = type(None)
>>> n = NoneType()
当我打印 n 时,我得到了几乎我所期望的:
>>> print(n)
None
但后来发生了这样的事情:
>>> n is None
True
和:
>>> id(n)
506768776
>>> id(None)
506768776
我的变量n
是None
。不仅同类型None
。它是None
。这不是我所期望的。
我尝试使用dis
来获取更多信息NoneType
,但是当我打电话时
>>> dis.dis(type(None))
它没有产生任何输出。
然后我尝试调查该__new__
方法,几个用户在评论中提到了该方法:
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
与 Object 完全相同None
? - 为什么将语言设计
n
为与 Object 完全相同None
? - 甚至如何在 python 中实现这种行为?