__new__、__init__、__del__三个方法用于实例的创建和销毁,在使用python的类中,我们最常用的是__init__方法,通常称为构造方法,__new__方法几乎不会使用,这篇文章是基于Python3.6为基础来做实验,主要谈一谈python的__new__和__init__,__init__ 通常称为构造方法,但其实它是个“初始化方法”,真正的构造方法是 __new__, __init__既然是初始化方法,那么肯定是对对象的初始化,也就是存在一个被初始化的对象

来看第一个例子:

class inch():def __init__(self):print("__init__")

def __new__(cls):print("__new__ ")print("__new__ ")

__new__None
 

因为我们没有从__new__返回任何结果,__init__这里不会调用。如果init被调用,我们就会看到我们在init中的打印语句。

再看第二个例子:

class inch():def __new__(cls):print("__new__ ")print(super(inch, cls).__new__(cls)) return super(inch, cls).__new__(cls)def __init__(self):print("__init__")

print(inch())

__new__<__main__.inch object at 0x002BF170>__init__<__main__.inch object at 0x002BF170>

用于构建实例的是特殊方法 __new__:是个类方法(不需要使用@classmethod),调用 __init__ 方法时要传入实例,__new__必须返回一个实例。返回的实例会作为第一个参数(即 self)传给 __init__ 方法。注意:__init__不允许返回任何值

再看第三个列子:

class inch(float):def __new__(cls, args=0.0):cls.new = float.__new__(cls,args*0.0254)return cls.newdef __init__(self,a):print("__init__")print(a)

object1=inch(3)print(object1.new)

__init__30.07619999999999999

__init__方法中除了self之外定义的参数,都必须与__new__方法中除cls参数之外的参数保持一致

无论我们给超类的__new__传递的是哪个类,它都会创建该类的一个实例,如何我们想要创建一个inch的实例,所以,inch类必须作为第一个参数传递给float.__new__。在类inch的内部,cls指的是inch类,因此,我们需要将cls作为第一个参数传递给对象。

第四个例子:

class B(float):pass

class inch(float):def __new__(cls, args=0.0): B.new = float.__new__(B,args*0.0254)return B.newdef __init__(self,a):print("__init__")print(a)

object1=inch(3)print(type(object))print(object1.new)

<class '__main__.B'>0.0761999999999999

最后:__new__是用来创建一个实例的,从 object 类继承的已经很完善。所以我们基本上不需要自己编写 __new__ 方法
第四个例子,一个__new__的应用,著名的单例模式(:python 中 None 对象就是单例):

class Singleton:    _instance = None    def __new__(cls, *args, **kwargs):if not isinstance(cls._instance, cls):cls._instance = object.__new__(cls, *args, **kwargs)return cls._instance

a=Singleton()b=Singleton()print(a is b)

True
 

__del__:在需要销毁实例的时候,python解释器会调用__del__方法。Cpython中垃圾回收的主要算法是引用计数,每个对象会统计有多少引用指向自己。当引用计数归零时,对象立即就被销毁

转载于:https://www.cnblogs.com/flashBoxer/p/9622643.html

python中的__new__、__init__和__del__相关推荐

  1. Python中常见的__init__.py是什么意思?详解Python import的方式和原理

    Python中常见的__init__.py是什么意思?详解Python import的方式和原理 1 什么是模块化编程? 2 __init__.py文件的作用 3 Python如何import第三方库 ...

  2. python中的__new__与__init__,新式类和经典类(2.x)

    在python2.x中,从object继承得来的类称为新式类(如class A(object))不从object继承得来的类称为经典类(如class A()) 新式类跟经典类的差别主要是以下几点: 1 ...

  3. python中__init__后面加特殊符号_详解Python中的__new__、__init__、__call__三个特殊方法...

    __new__: 对象的创建,是一个静态方法,第一个参数是cls.(想想也是,不可能是self,对象还没创建,哪来的self) __init__ : 对象的初始化, 是一个实例方法,第一个参数是sel ...

  4. python中的__new__和__init__

    一.__init__ 方法是什么? 使用Python写过面向对象的代码的同学,可能对 __init__ 方法已经非常熟悉了,__init__ 方法通常用在初始化一个类实例的时候. 这样便是__init ...

  5. Python中的__new__()方法的使用

    __new__() 函数只能用于从object继承的新式类. 先看下object类中对__new__()方法的定义: class object:   @staticmethod # known cas ...

  6. python中的__new__概念(工厂

    __new__方法实际上在__init__方法之前执行,用于创建类的实例.然而__init__方法负责实例创建后对其进行自定义,__new__方法才是实际上创建并返回实例的方法. __new__方法的 ...

  7. Python中的__new__(new函数)

    1.魔术方法 :  系统的函数,函数名称为 __xxx__,如 __init__,__new__,__del__等 __init__ : 可以定义一个对象的初始化操作,但是,__init__ 并不是第 ...

  8. python魔法方法__new__(),__init__()

    Python 2的早期,确实是没有__new__函数的,但那是很多年前的事情了,现在的Python 2和Python 3中,类实例的创建过程均遵循先调用__new__函数构造类实例,然后调用__ini ...

  9. 怎么理解python的__init___理解Python中super()和__init__()方法

    __init__()一般用来创建对象的实例变量,或一次性操作.super()用于调用父类的方法,可用来解决多重继承问题.单继承中,super()和__init__()功能类似,主要区别:1)使用sup ...

  10. python中错误TypeError: __init__() got an unexpected keyword argument 'shape'

    学习TensorFlow遇到的问题: 1 如何在不同计算图上定义和使用变量 书上代码: import tensorflow as tfg1 = tf.Graph() with g1.as_defaul ...

最新文章

  1. efishell无法开机shell_电脑出现EFIshellversion解决方法W1048/海尔青春小蓝
  2. Marine Life Science Technology(海洋生命科学与技术)被SCIE收录
  3. Java阶段性测试--第二三大题参考代码
  4. OpenCV | 双目相机标定之OpenCV获取左右相机图像+MATLAB单目标定+双目标定
  5. VTK:几何对象之Line
  6. php获取用户的上5级用户
  7. 现金贷平台倒闭后,借的钱是否可以不还?
  8. python报考软考哪个比较好_软考高级考哪个好?哪个比较热门?
  9. 哎呀你不要把他叫出来_不吼不叫,学会这3个亲子互动方法,孩子不专注都难...
  10. zabbix3.0.4监控mysql主从同步
  11. python连接wifi_Python3控制win10连接wifi热点
  12. Sharding-JDBC读写分离_实现_Sharding-Sphere,Sharding-JDBC分布式_分库分表工作笔记017
  13. ad怎么修改栅格_江苏宋女士回农村100万盖洋房,6个闺蜜结伴养老,你怎么看?...
  14. jetty jndi mysql_jetty配置jndi数据源
  15. 浅析tomcat原理
  16. 微信,你的野心到底有多大?
  17. html5+css3.5手机站标准写法,移动端手机网站基本模板
  18. Android Killer反编译时遇到的异常
  19. Logcat 的使用方法
  20. 【绘制】HTML5 Canvas绘画画板小项目:可编辑控制的贝塞尔曲线(可控制锚点和控制点的位置)

热门文章

  1. 《Java 解惑》笔记(一)
  2. EMNLP'21 | 学习改写非自回归机器翻译的翻译结果
  3. 博士招生 | 北京大学和中山大学博士申请考核还有名额,门槛不高,速来
  4. 新年干货 | NLP一路走来的经验之谈
  5. 一文入门Python 3
  6. 20200203_knn分类算法
  7. 深度学习2.0-39.RNN训练难题-梯度弥散与梯度爆炸
  8. 揭秘Keras推荐系统如何建立模型、获取用户爱好
  9. PIC浅谈--《x86/x64体系探索及编程》试读
  10. 软件测试管理是什么?