这不是什么特别的,只是对于某些类型,这是一种默认的“空”对象,而对于其他对象则没有.您的实例基本相当于:
int()
dict()
list()
float()
str()
complex()
tuple()
. . .所有这些都工作.你最后三个例子基本上是试图创建新的NoneType,function和type的实例.
> NoneType由于唯一的原因而失败,因为None是单例,而NoneType类型只能有一个实例,即None对象. (你收到的具体错误信息有点奇怪,但是如果你做了types.NoneType(),你会得到一个更直接的消息,指出“无法创建NoneType实例”.)
>函数失败,因为正如你所看到的,它需要一个参数,你不提供一个参数.您需要的是一个代码对象,您可以从现有函数或编译函数获取. (它也需要一个全局参数,这可以是一个dict.)
>键入失败,因为您没有提供足够的参数.您可以使用类型(foo)获取foo的类型,也可以输入(name,bases,dict)来创建一个新类型(即类).
请注意,在上一个例子中,您正在使用对象的类型,它本身就是一种类型.如果你使用x = object()(使x成为一个单独的对象而不是对象类型),那么它将工作并创建一个“空白”对象.
要记住的是,调用__new__并不是那么神奇.当您直接尝试通过执行someType()实例化类型时,会发生什么.如果该类型需要参数,调用__new__将失败,就像任何其他函数调用将失败,如果您不给它正确的参数,因为type(x).__ new__只是一个像任何其他函数一样的功能.您可以使用用户定义的类来看到它:
>>> class Foo(object):
... pass
>>> x = Foo(); print type(x).__new__(x.__class__)
>>> class Foo(object):
... def __init__(self, someArg):
... pass
>>> class Foo(object):
... def __new__(cls, someArg):
... return super(Foo, cls).__new__(cls)
>>> x = Foo(2); print type(x).__new__(x.__class__)
Traceback (most recent call last):
File "", line 1, in
x = Foo(2); print type(x).__new__(x.__class__)
TypeError: __new__() takes exactly 2 arguments (1 given)
在第一种情况下成功,因为我的课不需要论据;它在第二类中失败,因为第二类确实需要参数.
__new__不会因任何秘密原因而失败;它只是失败,因为您尝试实例化的类型需要参数才能构造一个实例. (None是唯一的,在这里是不一样的,因为没有特殊的原因,因为None是Python中的一个特殊对象).