我最近在某个地方读到,python中的特殊值None是其自己类的单例对象,特别是NoneType。这解释了很多,因为大多数涉及python中的None的错误都产生AttributeError,而不是某些特殊的“NoneError”或某些错误。

由于所有这些AttributeErrors都反射(reflect)了NoneType缺少的属性,因此,我对NoneType所具有的属性(如果有的话)很感兴趣。

我决定研究此NoneType并进一步了解它。我一直发现学习新语言功能的最佳方法是使用它,因此我尝试在IDLE中实例化NoneType:

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

现在很困惑,我做了一个快速的谷歌搜索。这表明for some reason NoneType was somehow removed in Python 3.

好吧,我,哈哈!我可以通过将None的类型存储在变量中来解决此问题,因为classes are objects in python.似乎可行:
>>> NoneType = type(None)
>>> n = NoneType()

当我打印n时,我得到的是我所期望的:
>>> print(n)
None

但这然后发生了:
>>> n is None
True

和:
>>> id(n)
506768776
>>> id(None)
506768776

我的变量nNone。不仅类型与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
>>>

更多错误。

这是我的问题:
  • 为什么nNone完全相同的对象?
  • 为什么设计语言时使nNone完全相同?
  • 甚至如何在python中实现这种行为?
  • 最佳答案

    为什么nNone完全相同的Object?

    C实现保留一个单例实例。 NoneType.__new__返回单例实例。

    为什么设计语言时要使n与None完全相同?

    如果没有单例实例,则您不能依赖x is None检查,因为is运算符基于身份。尽管None == None也是True,但是当x == None实际上不是True时,有可能使xNone。有关示例,请参见this answer

    甚至如何在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)
    

    输出:



    当然,这个简单的例子并不能使创建第二个实例成为可能。

    关于python - NoneType,原因和详细信息的实现,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20833081/

    10-13 09:36