鱼C论坛

 找回密码
 立即注册
查看: 2124|回复: 5

__new__求助

[复制链接]
发表于 2017-4-1 20:37:09 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
__new__(cls[, ...])       
1. __new__ 是在一个对象实例化的时候所调用的第一个方法
2. 它的第一个参数是这个类,其他的参数是用来直接传递给 __init__ 方法
3. __new__ 决定是否要使用该 __init__ 方法,因为 __new__ 可以调用其他类的构造方法或者直接返回别的实例对象来作为本类的实例,如果 __new__ 没有返回实例对象,则 __init__ 不会被调用
4. __new__ 主要是用于继承一个不可变的类型比如一个 tuple 或者 string

第三点 怎么去理解?
我现在理解下来,__new__这个方法 主要是用于修改一些无法改变的类型时候使用,但是还是对它的具体使用不太了解,求指教!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-4-1 21:53:35 | 显示全部楼层
http://stackoverflow.com/questions/674304/pythons-use-of-new-and-init
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-2 09:36:50 | 显示全部楼层
class A(object):
    def __init__(self):
        print "init"
    def __new__(cls,*args, **kwargs):
        print "new %s"%cls
        return object.__new__(cls, *args, **kwargs)

A()

输出:

new <class '__main__.A'>
init



知识点:

继承自object的新式类才有__new__

__new__至少要有一个参数cls,代表要实例化的类,此参数在实例化时由Python解释器自动提供

__new__必须要有返回值,返回实例化出来的实例,这点在自己实现__new__时要特别注意,可以return父类__new__出来的实例,或者直接是object的__new__出来的实例

__init__有一个参数self,就是这个__new__返回的实例,__init__在__new__的基础上可以完成一些其它初始化的动作,__init__不需要返回值

若__new__没有正确返回当前类cls的实例,那__init__是不会被调用的,即使是父类的实例也不行


class A(object):
    pass

class B(A):
    def __init__(self):
        print "init"
    def __new__(cls,*args, **kwargs):
        print "new %s"%cls
        return object.__new__(A, *args, **kwargs)

b=B()
print type(b)
输出:

new <class '__main__.B'>
<class '__main__.A'>


与__init__一样,每当实例化类时MyClass(*args, **kwargs) ,__new__ 都会默认自动执行MyClass.__new__(*args, **kwargs),如果想改变默认__new__行为,可以对它自定义

看一个英寸转换为米例子:

1 class inch(float):
2     def __new__(cls, arg=0.0):
3         return float.__new__(cls, arg * 0.0254)
改变了__new__的自定义实例化类

inch继承自float

如果同时存在__new__ ,__init__则__new__比__init__先运行,__new__将返回一个对象

a = inch(12)

print isinstance(a, float) 这里将会是True,可以认为inch实例化的对象类型是float,是可以直接拿来做加减乘除等操作

print a + 0.1 #进行基本的浮点运算。

再来个单例的,通过重载__new__实现单例:

class Singleton(object):
    def __new__(cls, *args, **kwargs):
        if not hasattr(cls, '_instance'):
            cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs)
        return cls._instance
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-2 21:07:19 | 显示全部楼层
新手·ing 发表于 2017-4-2 09:36
class A(object):
    def __init__(self):
        print "init"

*args, **kwargs 是什么意思?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-2 21:16:55 | 显示全部楼层
新手·ing 发表于 2017-4-2 09:36
class A(object):
    def __init__(self):
        print "init"

没怎么看懂。。。 好难啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-3 09:28:16 | 显示全部楼层
snakeshe 发表于 2017-4-2 21:07
*args, **kwargs 是什么意思?

可以接受任意个参数的参数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-7 10:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表