NoneType,原因和详细信息的实现
我最近在某处读到None
python中的特殊值是其所属类的singleton对象,尤其是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'>
现在很困惑,我做了一个快速的谷歌搜索。这表明出于某种原因在Python
3中删除了NoneType。
好吧,我,哈哈!我可以通过将None
变量的类型存储在变量中来解决此问题,因为类是python中的对象。这似乎可行:
>>> NoneType = type(None)
>>> n = NoneType()
当我打印n时,我得到的是我所期望的:
>>> print(n)
None
但是后来发生了:
>>> n is None
True
和:
>>> id(n)
506768776
>>> id(None)
506768776
我的变量n
IS 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
对象与完全相同None
? - 为什么设计的语言
n
与Object完全相同None
? - 一个人怎么会在python中实现这种行为呢?
-
为什么
n
对象与完全相同None
?C实现保留一个单例实例。
NoneType.__new__
返回单例实例。为什么设计语言时要使n与Object完全相同
None
?如果没有单例实例,则
x is None
由于is
操作员基于身份,因此您不能依赖检查。尽管None == None
也是如此True
,但实际上可能x == None
是True
在何时。有关示例,请参见此答案。x``None
一个人怎么会在python中实现这种行为呢?
您可以通过重写实现此模式
__new__
。这是一个基本示例:class Singleton(object): _instance = None def __new__(cls, *args, **kwargs): if Singleton._instance is None: Singleton._instance = object.__new__(cls, *args, **kwargs) return Singleton._instance if __name__ == '__main__': s1 = Singleton() s2 = Singleton() print 's1 is s2:', s1 is s2 print 'id(s1):', id(s1) print 'id(s2):', id(s2)
输出:
s1是s2:真实
ID(s1):4506243152
id(s2):4506243152
当然,这个简单的示例不会使创建第二个实例成为 不可能 。