Python中__new__和__init__的区别与联系
__new__和__init__的区别主要表现在:它自身的区别及在Python中新式类和老式类的定义。 __new__ 负责对象的创建而 __init__ 负责对象的初始化。 __new__:创建对象时调用,会返回当前对象的一个实例 __init__:创建完对象后调用,对当前对象的一些实例初始化,无返回值 1. 在类中,如果__new__和__init__同时存在,会优先调用__new__ class ClsTest(object): def __init__(self): print("init") def __new__(cls,*args, **kwargs): print( 在Python编程语言中,`__new__`和`__init__`都是特殊方法(也称为魔术方法),它们在创建和初始化对象时起着至关重要的作用。理解这两个方法的区别和联系对于深入掌握Python面向对象编程至关重要。 让我们来分别探讨`__new__`和`__init__`的功能: 1. `__new__(cls, *args, **kwargs)`: - `__new__`是类的第一个被调用的方法,当尝试创建一个新的对象时,Python会先调用`__new__`。 - 这个方法负责创建一个新的对象实例。它的第一个参数`cls`是指向要实例化的类的引用,其余参数可以传递给类的构造函数。 - `__new__`必须返回一个对象的实例,通常是`cls`参数指定的类的实例。如果没有返回值,Python将无法识别新创建的对象,导致错误。 - 如果`__new__`返回的是现有类的实例(例如父类的实例),那么`__init__`将不会被调用,因为Python认为已经有一个对象实例了。 2. `__init__(self, *args, **kwargs)`: - `__init__`是在`__new__`之后被调用的方法,用于初始化新创建的对象。 - 它的主要任务是对对象进行设置,比如赋值属性、调用其他方法等。`self`参数是`__new__`返回的实例,通常在`__init__`中用于操作或修改对象的状态。 - `__init__`方法没有返回值,其主要目的是设置或准备实例,而不是返回任何对象。 接下来,我们通过一些例子来进一步理解它们的区别: 1. 当`__new__`和`__init__`同时存在时,`__new__`会被优先调用: ```python class ClsTest(object): def __init__(self): print("init") def __new__(cls, *args, **kwargs): print("new") ClsTest() ``` 在这个例子中,`new`先被打印,说明`__new__`先被调用。 2. 如果`__new__`返回一个对象的实例,`__init__`会被隐式调用: ```python class ClsTest(object): def __init__(self): print("init") def __new__(cls, *args, **kwargs): print("new %s" % cls) return object.__new__(cls, *args, **kwargs) ClsTest() ``` 这里,`new`和`init`都被打印,表明`__new__`创建了实例并调用了`__init__`。 3. `__new__`必须返回对象实例,`__init__`不应有返回值: ```python class ClsTest(object): def __init__(cls): cls.x = 2 print("init") return cls ClsTest() ``` 这段代码会引发错误,因为`__init__`试图返回`ClsTest`,而`__init__`应返回`None`。 4. 如果`__new__`不返回当前类的实例,`__init__`将不会被调用: ```python class ClsTest1(object): pass class ClsTest2(ClsTest1): def __init__(self): print("init") def __new__(cls, *args, **kwargs): print("new %s" % cls) return object.__new__(ClsTest1, *args, **kwargs) b = ClsTest2() print(type(b)) ``` 这里只打印了`new ClsTest2`,说明`__init__`没有被调用,因为返回的是`ClsTest1`的实例,不是`ClsTest2`。 总结一下,`__new__`和`__init__`是Python中对象生命周期的关键部分。`__new__`负责创建对象,而`__init__`则负责初始化对象。`__new__`必须返回一个实例,通常是新创建的类的实例,而`__init__`不需要返回值,主要用于设置实例的初始状态。只有当`__new__`返回当前类或其子类的实例时,`__init__`才会被调用,执行进一步的初始化工作。理解这两者之间的关系对于编写复杂的Python类和元类至关重要。



























- 粉丝: 3
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 机械制造企业项目管理应用分析.docx
- XXXX道路整治工程施工总进度具体计划横道图、网络图、总平面图.doc
- 电子商务网站建设中数据库安全隐患与策略分析.docx
- 服务器存储网络设备巡检报告.docx
- 单片机交通灯设计方案和实现.doc
- 单片机原理及应用技术试卷.doc
- 关于高校网络和信息安全管理与技术分析.docx
- 2012落索坡小学教育信息化建设方案.doc
- 输电线路工程项目管理实施对策分析.docx
- 淘宝网站的设计与应用.doc
- 网络教学下的数学课堂教学.docx
- 探索互联网+模式下提升档案社会服务的有效提升.docx
- spring-boot-seckill-C++资源
- 大数据时代下的物联网进程-专访中国工程院院士、中国互联网协会理事长邬贺铨.docx
- 西北工业大学入学测试机考模拟题及答案专升本计算机基础.doc
- 大数据时代基于云会计的库存管理模式构建.docx



评论0