类的构造器-init和new
提到构造器,大家都会想到 __init__,那么__new__是什么?也是构造器。
init 构造器
都很熟悉了,直接上代码
class MyClass(object):def __init__(self):passdef m1(self):print(3)mc = MyClass() mc.m1() # 3
是不是很简单
别急,请跟着我的思路,方法m1的参数有个self,这个self就是实例,在调用m1之前这个实例肯定已经产生了;但是init的参数也有个self,在调用init之前,我们并没有实例化,那这个self从何而来呢?new生成的。
new 构造器
1. new 和 init 一样都是类的构造器
2. new在init之前执行,即使没有显示定义
3. new 必须有返回对象,这个对象就是该类的实例,或者父类的实例(该类继承了一个类),并且是new出来的实例,这个实例的就是self,也就是该类的实例化对象。
4. new生成的self传给init,如果没有正确返回实例,init将不会执行。
5. new可以自定义
6. new是类方法,需要显示的传入类cls作为第一个参数,至少要有这个参数
7. 新式类中才有new
8. new和init共用参数,也就是说二者参数形式要一致
几个例子来验证上面8条。
代码1
class A(object):def __init__(self,a):print "init"self.a=adef __new__(cls,*args, **kwargs):print "new %s"%clsprint('args:', args)return object.__new__(cls, *args, **kwargs) # 返回当前类的实例 aa=A(3) # new <class '__main__.A'> # ('args:', (3,)) # init print(aa) # <__main__.A object at 0x026FC4B0> print(aa.a) # 3 self.a
1. 新式类,经典类我试了,不行,new没有运行,但不会报错
2. new 比 init 先执行
3. new 和 init 共用了参数3
4. new 返回了当前类的实例,new出来的
代码2
class inch(float):def __new__(cls, arg=0.0): # cls 相当于 selfprint(1)return float.__new__(cls, arg * 0.0254)def __init__(self, aa):print('aa:', aa)print(2)a = inch(12) # new 和 init 公用了参数12 # 1 # ('aa:', 12) # 2 print(a) # 返回的实例就是new的return,父类的实例 float(12*0.0254) # 0.3048 =12*0.0254
1. 该类继承了float类
2. new 返回了父类float的实例
3. 该类实例化后其实是new 返回的实例,也就是float(12*0.0254)
代码3
class inch2(float):def __new__(cls, arg=0.0): # cls 相当于 selfprint(11)return float.__new__(cls, arg)*0.0254 # 返回了父类的实例*0.0254def __init__(self,aa):print(22) # 这句没有被执行,因为new没有正确返回父类的实例 a = inch2(12) # 11 print(a) # 0.3048 =12*0.0254
new没有正确返回父类的实例,导致init没有被执行。
转载于:https://www.cnblogs.com/yanshw/p/10697235.html
类的构造器-init和new相关推荐
- TypeScript入门教程 之 类/抽象类/构造器/Getter/Setter
TypeScript入门教程 之 类/抽象类/构造器/Getter/Setter 将JavaScript中的类作为头等项很重要的原因是: 类提供了有用的结构抽象 为开发人员提供一种一致的方式来使用类, ...
- java接口构造函数_Java8自定义函数式编程接口和便捷的引用类的构造器及方法
什么是函数编程接口? 约束:抽象方法有且只有一个,即不能有多个抽象方法,在接口中覆写Object类中的public方法(如equals),不算是函数式接口的方法. 被@FunctionalInterf ...
- mysql构造器_类和对象,类的构造器,魔术方法__get()和__set(),mysql连接数据库的方式--2018年8月30日11时38分...
这一节课主要讲的是类和数据库的知识,主要是类和对象,类的构造器,魔术方法__get()和__set(),mysql连接数据库1. 什么是类 ?什么是对象?举例说明 答:类是对象的模板,对象是类的一个实 ...
- Kotlin - 类与构造器
类是什么? 类是一个抽象的概念,是具有某些特征的事物的概括,不特定指代任何一个具体的事物.写法: class <类名> {<成员> } Number(Int.Float.Byt ...
- Eclipse中快速为类提供构造器、get()、set()方法、重写toString()、hasCode()、equals()等
当我们写一个类的时候,经常会写构造器,get().set()方法等,以及打印类的信息需要重写toString方法等.这些eclipse已经为我们提供好了,只需直接点击输出即可.方法如下: Eclips ...
- String类及其构造器和常用方法
String类时lang包的内置类,使用时不需要引用. 一.构造器 String():通过new方法创建字符串 String(byte[] byte):把字节数字转换为字符串 异同比较: String ...
- Python10/22--面向对象编程/类与对象/init函数
类: 语法: class关键字 类名# 类名规范 大写开头 驼峰命名法class SHOldboyStudent: # 描述该类对象的特征 school = "上海Oldboy" ...
- java类的构造器可以被继承吗_java可以继承父类构造器吗
子类继承了父类,若父类的构造方法没有重载,那么,子类的构造方法也不需要通过super调用父类构造方法.一个类中如果构造方法重写了并且带了参数,那么这个类的原来系统默认的无参构造方法便消失.由此,若一个 ...
- JAVA构造器、静态上下文的执行时机与代码执行顺序详解
先看代码案例 package com.exemple.demo.test.preciate;public class Father {private int i = test();private st ...
最新文章
- 我们用Windows官方跑了跑Linux GUI应用程序,不愧是“胶水操作系统”
- Linux中设置服务自启动的三种方式(转)
- 扩展SpringMVC WebMvcConfigurerAdapter ||全面接管SpringMVC @EnableWebMvc
- Java语言特性运用:各种Java语法特性是怎样被Spring各种版本巧妙运用的?
- ubuntu7.10下的vi用的怪怪的
- html点赞插件,chrome空间自动点赞插件。浏览器插件简单例子。
- UVA11988 Broken Keyboard (a.k.a. Beiju Text)【输入输出+水题】
- 百度竞价排名曝光_企业入驻百度爱采购必须选好本地运营服务商
- LVS+Keepalived 高可用环境部署记录(主主和主从模式)
- Atitit. 构造ast 语法树的总结attilax oao
- MVC自定义路由的配置,必须把自己的路由写在前面
- 数据库字典收集整理,设计数据表时可拿来查考
- (附源码)小程序 记账微信小程序 毕业设计 180815
- 外卖cps淘客项目,一个被动引流躺着赚钱的玩法
- 镁光ddr3布线规则_讨论一下DDR3 缓存的电压和频率
- win10远程桌面连接
- 12级软件测试课程博客汇总
- TAPD使用方法学习
- java实现微信朋友圈点赞统计,微信朋友圈点赞测试用例
- 移动 APP 网络优化概述
热门文章
- 按键 使用WinHttp实现POST方式用户模拟登录网站
- VC6中使用内存DC加载并显示JPG图片的注意事项
- 顺序容器STL::list用法
- element-ui 设置table width %百分比
- [react] 请说说什么是useRef?
- [软技能] 请说说使用iconfont图标的优点和缺点
- [vue-cli]vue-cli3你有使用过吗?它和2.x版本有什么区别?
- 工作160:总结VUE几种页面刷新方法
- 前端学习(1885)vue之电商管理系统电商系统之首页路由的重定向
- 前端学习(759):预解析案例