博客
关于我
__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/

你可能感兴趣的文章
NLP问答系统:使用 Deepset SQUAD 和 SQuAD v2 度量评估
查看>>
NLP项目:维基百科文章爬虫和分类【02】 - 语料库转换管道
查看>>
NLP:使用 SciKit Learn 的文本矢量化方法
查看>>
nmap 使用方法详细介绍
查看>>
Nmap扫描教程之Nmap基础知识
查看>>
nmap指纹识别要点以及又快又准之方法
查看>>
Nmap渗透测试指南之指纹识别与探测、伺机而动
查看>>
Nmap端口扫描工具Windows安装和命令大全(非常详细)零基础入门到精通,收藏这篇就够了
查看>>
NMAP网络扫描工具的安装与使用
查看>>
NMF(非负矩阵分解)
查看>>
nmon_x86_64_centos7工具如何使用
查看>>
NN&DL4.1 Deep L-layer neural network简介
查看>>
NN&DL4.3 Getting your matrix dimensions right
查看>>
NN&DL4.7 Parameters vs Hyperparameters
查看>>
NN&DL4.8 What does this have to do with the brain?
查看>>
nnU-Net 终极指南
查看>>
No 'Access-Control-Allow-Origin' header is present on the requested resource.
查看>>
NO 157 去掉禅道访问地址中的zentao
查看>>
no available service ‘default‘ found, please make sure registry config corre seata
查看>>
No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK?
查看>>