当前位置:首页 > 编程问答 >

Python中__new__()和__init__()有什么区别

提问时间:2020年05月13日 11:42:30问题被 82 网友关注
共 1 个关于“Python中__new__()和__init__()有啥用法不同”精选答案
程浩然
推荐于:2020-05-13
最佳回答

其中,__new__()不是一定要有,只有继承自object的类才有,该方法可以return父类(通过super(当前类名, cls).__new__())出来的实例,或者直接是object的__new__出来的实例。值得注意的是,在定义子类时没有重新定义__new__()时,Python默认调用该类父类的__new__()方法来构造该类实例,如果该类父类也没有重写__new__(),那么将一直追溯至object的__new__()方法,因为object是所有新式类的基类。如果子类中重写了__new__()方法,那么可以自由选择任意一个其他的新式类。

可见,当类中同时出现__new__()和__init__()时,先调用__new__(),再调用__init__(),具体的执行过程为:

1. 调用实例对象代码xiaoming = Student('xiaoming',175);

2. 传入name和height的参数,执行Student类的__new__()方法,该方法返回一个类的实例,通常会用父类super(Student,cls).__new__(cls),__new__()产生的实例即__init__()的self;

3. 用实例来调用__init__()方法,进行初始化实例对象的操作。

可以看到,python中__new__()与__init__()的区别,

1.首先用法不同,__new__()用于创建实例,所以该方法是在实例创建之前被调用,它是类级别的方法,是个静态方法;

而 __init__() 用于初始化实例,所以该方法是在实例对象创建后被调用,它是实例级别的方法,用于设置对象属性的一些初始值。

由此可知,__new__()在__init__() 之前被调用。如果__new__() 创建的是当前类的实例,会自动调用__init__()函数,通过return调用的__new__()的参数cls来保证是当前类实例,如果是其他类的类名,那么创建返回的是其他类实例,就不会调用当前类的__init__()函数。

2.其次传入参数不同

__new__()至少有一个参数cls,代表当前类,此参数在实例化时由Python解释器自动识别;

__init__()至少有一个参数self,就是这个__new__()返回的实例,__init__()在__new__()的基础上完成一些初始化的操作。

3.返回值不同

__new__()必须有返回值,返回实例对象;

__init__()不需要返回值。

参考资料

  • 数据结构 Python语言描述出版社:人民邮电出版社 作者:兰伯特
  • 自然语言处理Python进阶出版社:机械工业出版社 作者:克里希纳·巴夫萨
  • 精通Python爬虫框架Scrapy出版社:人民邮电出版社 作者:迪米特里奥斯
  • Python自然语言处理实战:核心技术与算法出版社:机械工业出版社 作者:涂铭 刘祥 刘树春
  • 跟老齐学Python:轻松入门出版社:电子工业出版社 作者:齐伟
  • 相关问题

  • 掌握python中子类如何继承父类的__init__方法03-17
  • 介绍Python中的__init__的作用01-24
  • 详解Python函数any()和all()的用法和区别09-14
  • ipython和python区别点总结02-10
  • python中while和for的区别点整理04-23
  • python2与python3的区别点总结06-13
  • 搞清楚Python中capitalize()与title()的区别03-05
  • 深入理解Python中的 sort 和 sorted的用法与区别01-28
  • python和汇编语言的区别知识点09-05
  • python内置map和six.moves.map的区别点整理02-13
  • 浅析python爬取100与爬10的区别07-05
  • 简介python中eval和int的区别03-10
  • python编译器和解释器有哪些区别02-11
  • 更多答案
    网友NO.525989

    07-11

    Python中new类方法和init 实例方法以及单例模式的介绍(附示例),本篇文章给大家带来的内容是关于Python中new类方法和init 实例方法以及单例模式的介绍(附示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 “Python 中的类都是单例模式?” 一天,一同事问我这样一个问题。这是一个奇怪的问题,可能你也这么认为。这里先不做解释,我们先来看看 __new__ 和 __init__ 方法。 new 与 init __new__ 方法属于新式类,即属于 object 类。它是一个静态方法,但是其第一个参数必须是一个类(cls),这有点像一个 classmethod,其实将其看成是一个类方法也可以。该特殊方法被调用时,会创建类(cls)的一个新实例并返回,实例被创建后解释器会将该实例以及其它的……

    网友NO.729934

    06-03

    Python中new方法的详解, new_ 方法是什么? __new__方法其实就是创建对象的方法 new()方法是在类准备将自身实例化时调用。 一个类可以有多个位置参数和多个命名参数,而在实例化开始之后,在调用 init()方法之前,Python首先调用new()方法: def new(cls, *args, **kwargs):… 第一个参数cls是当前正在实例化的类。 如果要得到当前类的实例,应当在当前类中的new()方法语句中调用当前类的父类 的new()方法。 例如,如果当前类是直接继承自object,那当前类的new()方法返回的对象应该为: def new(cls, *args, **kwargs):…return object.new(cls) 通常来说,当前类开始实例化时,new()方法会返回cls(cls指代当前类)的实例,然后该类的init()方法作为构造方法会……

    网友NO.113428

    09-08

    Python中使用__new__实现单例模式并解析, 单例模式是一个经典设计模式,简要的说,一个类的单例模式就是它只能被实例化一次,实例变量在第一次实例化时就已经固定。 在Python中常见的单例模式有None,这就是一个很典型的设计,通常使用 if xxx is None或者if xxx is not None来比较运算。 Python实现单例模式 代码如下: class MyClass: _instance = None _first_init = False def __new__(cls, *args, **kwargs): if not cls._instance: cls._instance = super().__new__(cls) return cls._instance def __init__(self, var1, var2): cls = type(self) if not cls._first_init: self.var1 = var1 self.var2 = var2 cls._first_init = True 如上所示,我创建了一个MyClass的类,定义了两个类变量,第一个是_instance,它负责保存该类创建的实例。第二……

    <
    1
    >

    Copyright 2018-2020 www.xz577.com 码农之家

    版权投诉 / 书籍推广 / 赞助:520161757@qq.com