欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

python之__new__与__init__方法的区别

程序员文章站 2022-05-31 23:32:35
...
先上例子:
class  User:
    def __new__(cls, *args, **kwargs):
        print("new")

    def __init__(self,name):
        self.name=name
        print("init")

user=User()

打印结果:
    new
并没有打印出init,why?再看下面的代码:
class  User:
    def __new__(cls, *args, **kwargs):
        print("new")
        return super().__new__(cls,*args, **kwargs)

    def __init__(self,name):
        self.name=name
        print("init")

user=User()

打印结果:
     new
     init

    由上面两个例子可以看出:
1、__new__比__init__先执行
2、__new__必须有return,否则__init__不会执行
3、__new__的返回对象传递给__init__,为它的self参数;new是在对象生成之前所做的动作,init在对象生成之后完善对象的属性,也可以说new用于生成对象的,在return中生成,然后返回,返回的对象传递给init,init的self即为new的对象。

    大多数情况我们是不需要重新__new__函数的,但是当我们的父类是str、int、tuple等这些不可变的class时,我们需要重写new来自定义这些类的实例化过程。
    例如我们需要一个永远都是正数的整数类型:
class PositiveInteger(int):
    def __init__(self, value):
        super(PositiveInteger, self).__init__(self, abs(value))

i = PositiveInteger(-3)
print i

    运行后会发现,结果根本不是我们想的那样,我们仍然得到了-3。这是因为对于int这种 不可变的对象,我们只有重载它的new方法才能起到自定义的作用,修改后的代码:
class PositiveInteger(int):
    def __new__(cls, value):
        return super(PositiveInteger, cls).__init__(cls, abs(value))

i = PositiveInteger(-3)
print i

    结果为3,得到我们需要的类。
相关标签: python