博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python中的__new__、__init__和__del__
阅读量:5129 次
发布时间:2019-06-13

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

__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.new def __init__(self,a): print("__init__") print(a) object1=inch(3) print(object1.new) __init__ 3 0.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.new def __init__(self,a): print("__init__") print(a) object1=inch(3) print(type(object)) print(object1.new) 
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

你可能感兴趣的文章
一月流水账
查看>>
数论四大定理
查看>>
npm 常用指令
查看>>
C#基础知识面试经典[整理]
查看>>
20几个正则常用正则表达式
查看>>
TextArea中定位光标位置
查看>>
非常棒的Visual Studo调试插件:OzCode 2.0 下载地址
查看>>
判断字符串在字符串中
查看>>
hdu4374One hundred layer (DP+单调队列)
查看>>
类间关系总结
查看>>
properties配置文件读写,追加
查看>>
Linux环境下MySql安装和常见问题的解决
查看>>
lrzsz——一款好用的文件互传工具
查看>>
ZPL语言完成条形码的打印
查看>>
这20件事千万不要对自己做!
查看>>
Linux环境下Redis安装和常见问题的解决
查看>>
Android开发中常见问题分析及解决
查看>>
玩转小程序之文件读写
查看>>
Android开发中UI相关的问题总结
查看>>
MySql Host is blocked because of many connection errors 问题的解决方法
查看>>