python之__new__与__init__方法的区别
程序员文章站
2022-05-31 23:32:35
...
先上例子:
打印结果:
new
并没有打印出init,why?再看下面的代码:
打印结果:
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来自定义这些类的实例化过程。
例如我们需要一个永远都是正数的整数类型:
运行后会发现,结果根本不是我们想的那样,我们仍然得到了-3。这是因为对于int这种 不可变的对象,我们只有重载它的new方法才能起到自定义的作用,修改后的代码:
结果为3,得到我们需要的类。
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 Selenium 之关闭窗口close与quit的方法
-
详解Python中的__new__、__init__、__call__三个特殊方法
-
Python探索之静态方法和类方法的区别详解
-
Python机器学习之scikit-learn库中KNN算法的封装与使用方法
-
Python实例方法、类方法、静态方法的区别与作用详解
-
Python - 基本数据类型及其常用的方法之数字与字符串
-
python面试题之python多线程与多进程的区别
-
Python中append、extend与insert几个方法的区别
-
深入理解Python中的 __new__ 和 __init__及区别介绍
-
python3.6之filter()函数与python2的区别讲解