python中new和init内置函数的区别

__init__(self)__new__(cls)
参数是self : 实例化对象参数cls : 表示当前类本身
无返回值又返回值
对实例化对象进行初始化操作为实例化对象开辟内存空间,创建空对象
在创建对象时自动被调用

在创建对象时自动被调用,new在init之前先被调用

new先开辟内存空间,创建一个空的对象,再将创建的空的对象return给init;

init再在开辟的内存空间内对这个空对象进行初始化,包括对象的属性。

如果new没有return那么init方法就不会被调用

绝大多数时间不需要我们实现__new__方法,python已经帮我们实现:使用父类的__new__()方法来创建对象并返回. 所以例子1中的两个类是等价的
__init__(self, par1, par2) 和__new__(cls, par1, par2)中的参数及其个数要保持一致, 否则会报错。因为在初始化对象时都会经过__new__(cls)方法,所以一般new方法参数写成可变参数__new__(cls, *args, **kwargs)来保持与init中参数个数一致。
可以只用__new_(cls, *args, **kwargs)而不用__init__(self)来实例化对象(我们创建类时不写new因为python中默认隐藏new方法,如例子2)

例子 1:

class testA(object):
    def __new__(cls, *args, **kwargs):
        return super().__new__(cls)
    def foncA(self):
        print("fonction A")

class testB(object):
    def foncB(self);
        print("fonction B")

__new__(cls)中第一个参数是cls,是因为cls相当于c当前的lass调用__new__(cls)时,实例对象还没有被创建出来。

大部分情况都不需要实现__new__(cls)方法,因为python中已经默认实现,使用父类super().__new__(cls)方法创建对象并将对象放回给init,所以以上代码是等价的。

例子2:

class Person(object):
    def __new__(cls, age):
        print('__new__() called.')
        obj = super().__new__(cls)
        obj.age = age
        return obj

a = Person(100)
a.age # 100

如上的写法正确但是不建议,一般采用如下写法

class Person(object):
    def __init__(self, age):
        self.age = age
a = Person(100)
a.age # 100

常用定义类的完整写法应该是 

class Person(object):
    def __new__(cls, *args, **kwargs):
        return super().__new__(cls)
    def __init__(self, age):
        self.age = age
a = Person(100)
a.age # 100

参考文章:http://t.csdn.cn/Hb26s

http://t.csdn.cn/6DgGZ

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值