python new一个对象_使用__new__的现有对象的Python对象

这不是什么特别的,只是对于某些类型,这是一种默认的“空”对象,而对于其他对象则没有.您的实例基本相当于:

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中的一个特殊对象).

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值