python中的__new__、__init__和__del__
__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__相关推荐
- Python中常见的__init__.py是什么意思?详解Python import的方式和原理
Python中常见的__init__.py是什么意思?详解Python import的方式和原理 1 什么是模块化编程? 2 __init__.py文件的作用 3 Python如何import第三方库 ...
- python中的__new__与__init__,新式类和经典类(2.x)
在python2.x中,从object继承得来的类称为新式类(如class A(object))不从object继承得来的类称为经典类(如class A()) 新式类跟经典类的差别主要是以下几点: 1 ...
- python中__init__后面加特殊符号_详解Python中的__new__、__init__、__call__三个特殊方法...
__new__: 对象的创建,是一个静态方法,第一个参数是cls.(想想也是,不可能是self,对象还没创建,哪来的self) __init__ : 对象的初始化, 是一个实例方法,第一个参数是sel ...
- python中的__new__和__init__
一.__init__ 方法是什么? 使用Python写过面向对象的代码的同学,可能对 __init__ 方法已经非常熟悉了,__init__ 方法通常用在初始化一个类实例的时候. 这样便是__init ...
- Python中的__new__()方法的使用
__new__() 函数只能用于从object继承的新式类. 先看下object类中对__new__()方法的定义: class object: @staticmethod # known cas ...
- python中的__new__概念(工厂
__new__方法实际上在__init__方法之前执行,用于创建类的实例.然而__init__方法负责实例创建后对其进行自定义,__new__方法才是实际上创建并返回实例的方法. __new__方法的 ...
- Python中的__new__(new函数)
1.魔术方法 : 系统的函数,函数名称为 __xxx__,如 __init__,__new__,__del__等 __init__ : 可以定义一个对象的初始化操作,但是,__init__ 并不是第 ...
- python魔法方法__new__(),__init__()
Python 2的早期,确实是没有__new__函数的,但那是很多年前的事情了,现在的Python 2和Python 3中,类实例的创建过程均遵循先调用__new__函数构造类实例,然后调用__ini ...
- 怎么理解python的__init___理解Python中super()和__init__()方法
__init__()一般用来创建对象的实例变量,或一次性操作.super()用于调用父类的方法,可用来解决多重继承问题.单继承中,super()和__init__()功能类似,主要区别:1)使用sup ...
- python中错误TypeError: __init__() got an unexpected keyword argument 'shape'
学习TensorFlow遇到的问题: 1 如何在不同计算图上定义和使用变量 书上代码: import tensorflow as tfg1 = tf.Graph() with g1.as_defaul ...
最新文章
- efishell无法开机shell_电脑出现EFIshellversion解决方法W1048/海尔青春小蓝
- Marine Life Science Technology(海洋生命科学与技术)被SCIE收录
- Java阶段性测试--第二三大题参考代码
- OpenCV | 双目相机标定之OpenCV获取左右相机图像+MATLAB单目标定+双目标定
- VTK:几何对象之Line
- php获取用户的上5级用户
- 现金贷平台倒闭后,借的钱是否可以不还?
- python报考软考哪个比较好_软考高级考哪个好?哪个比较热门?
- 哎呀你不要把他叫出来_不吼不叫,学会这3个亲子互动方法,孩子不专注都难...
- zabbix3.0.4监控mysql主从同步
- python连接wifi_Python3控制win10连接wifi热点
- Sharding-JDBC读写分离_实现_Sharding-Sphere,Sharding-JDBC分布式_分库分表工作笔记017
- ad怎么修改栅格_江苏宋女士回农村100万盖洋房,6个闺蜜结伴养老,你怎么看?...
- jetty jndi mysql_jetty配置jndi数据源
- 浅析tomcat原理
- 微信,你的野心到底有多大?
- html5+css3.5手机站标准写法,移动端手机网站基本模板
- Android Killer反编译时遇到的异常
- Logcat 的使用方法
- 【绘制】HTML5 Canvas绘画画板小项目:可编辑控制的贝塞尔曲线(可控制锚点和控制点的位置)