博客
关于我
__init__ 和 __new__(重点)
阅读量:286 次
发布时间:2019-03-01

本文共 2077 字,大约阅读时间需要 6 分钟。

Python中的__new____init__方法在对象创建过程中起着关键作用。__new__方法在对象被创建之前被调用,负责返回一个新的对象实例,而__init__方法在对象创建之后被调用,用来初始化对象的属性和状态。理解这两者的区别和顺序对编写高效且可靠的Python代码至关重要。

__new__方法的作用

__new__方法是对象创建之前被调用的类方法。它的主要职责是创建一个对象实例,并返回这个实例。__new__方法的定义为:

def __new__(cls, *args, **kwargs):    # 代码逻辑    return obj

其中,cls参数表示当前类,argskwargs是用于传递额外参数和关键字参数。__new__方法必须返回一个实例,这个实例可以是当前类的实例,也可以是其他类的实例,甚至是直接从object类创建的实例。

如果一个类没有自定义__new__方法,Python会使用其父类的__new__方法,依次递归,直到object类的__new__方法被调用。object类的__new__方法返回一个新的不带类型的对象实例。

__init__方法的作用

__init__方法是在对象被创建之后被调用的实例方法。它的主要职责是初始化对象的属性和状态。__init__方法的定义为:

def __init__(self, name):    # 代码逻辑    self.name = name

这里的self参数是指当前实例,即__new__方法返回的实例。__init__方法通常用于将传入的参数赋值给实例的属性,设置初始状态。

如果__new__方法返回一个不是当前类的实例(例如返回字符串或其他类型),那么__init__方法不会被自动调用。这意味着任何自定义的__init__方法都不会执行,可能导致对象属性未能正确初始化。

__new____init__的执行顺序

在Python中,__new__方法总是在__init__方法之前被调用。__new__的返回值决定了是否会调用__init__方法。如果__new__返回一个当前类的实例,那么__init__方法会被自动调用;否则,__init__不会被调用。

示例分析

考虑以下Person类的定义:

class Person:    def __init__(self, name):        print("触发__init__")        self.name = name    def __new__(cls, *args, **kwargs):        print("触发__new__")        obj = super(Person, cls).__new__(cls)        return obj

当执行p = Person("淘小欣")时,首先会调用Person.__new__(),创建一个新的Person实例,然后再调用Person.__init__(),将name属性初始化为"淘小欣"。

如果__new__方法返回一个非Person实例(例如返回字符串"淘小欣"),那么__init__方法不会被调用,导致p.name可能无法访问,出现AttributeError

继承类的处理

在继承关系中,子类的__new__方法会调用父类的__new__方法,除非被显式地重写。例如:

class Str:    passclass Person(Str):    def __new__(cls, *args, **kwargs):        obj = super(Str, cls).__new__(cls)        print(obj.__class__)        return obj    def __init__(self, name):        print("触发__init__")        self.name = name

在上述代码中,Person继承自Str,并在__new__方法中调用Str__new__方法。这样,obj将是Str实例,而不是Person实例。这意味着Person.__init__不会被调用,p.name同样会抛出AttributeError

返回值的重要性

__new__方法必须返回一个实例对象,否则会导致错误。在编写__new__方法时,必须确保返回的是一个正确的对象实例。如果返回的是非对象类型(如字符串、数字等),则可能导致后续的__init__方法无法正确执行。

总结

__new____init__是Python中对象创建过程中的两个关键步骤。__new__负责创建对象实例,而__init__则负责初始化对象的属性和状态。理解这两者的区别和执行顺序对于编写高效且可靠的Python代码至关重要。在实际编码中,应谨慎处理__new____init__的返回值,确保它们正确地创建和初始化对象。

转载地址:http://amto.baihongyu.com/

你可能感兴趣的文章
python系列【仅供参考】:python之subprocess模块rsync拉取文件
查看>>
python系列【仅供参考】:python 远程rdp
查看>>
python基础
查看>>
Python基本语法与变量类型
查看>>
python基本数据类型(容器)- tuple list dict set
查看>>
python基本工资的调整方案_Python薪资又涨了!这可咋办!
查看>>
Python基准测试和性能分析内存管理和垃圾回收
查看>>
Python基于RESTful风格的接口自动化测试实战
查看>>
python基于pygame实现跨年烟花效果
查看>>
python基于flask搭建http服务(四)—— Docker容器化部署
查看>>
python基于flask搭建http服务(二)—— 实现Excel上传、数据清洗、入库
查看>>
python基于flask搭建http服务(三)—— 使用gunicorn部署项目
查看>>
python基于flask搭建http服务(一)—— 实现数据查询和Excel导出
查看>>
Python块键盘/鼠标输入
查看>>
python在心理学研究中的应用有哪些_心理学在线研究可用平台简介和应用进展
查看>>
python系列【仅供参考】:python tornado 集成redis消息订阅的异步任务之后tornado主程序无法启动,解决方案
查看>>
python在使用HTMLTestRunner时,报告为空,错误提示<_io.TextIOWrapper name='<stderr>' mode='w' encoding='utf_8'>...
查看>>
python在gpu上运行_【python】python开启GPU加速
查看>>
Python在def函数中使用for循环
查看>>
Python在def函数中使用for循环
查看>>