提到构造器,大家都会想到 __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相关推荐

  1. TypeScript入门教程 之 类/抽象类/构造器/Getter/Setter

    TypeScript入门教程 之 类/抽象类/构造器/Getter/Setter 将JavaScript中的类作为头等项很重要的原因是: 类提供了有用的结构抽象 为开发人员提供一种一致的方式来使用类, ...

  2. java接口构造函数_Java8自定义函数式编程接口和便捷的引用类的构造器及方法

    什么是函数编程接口? 约束:抽象方法有且只有一个,即不能有多个抽象方法,在接口中覆写Object类中的public方法(如equals),不算是函数式接口的方法. 被@FunctionalInterf ...

  3. mysql构造器_类和对象,类的构造器,魔术方法__get()和__set(),mysql连接数据库的方式--2018年8月30日11时38分...

    这一节课主要讲的是类和数据库的知识,主要是类和对象,类的构造器,魔术方法__get()和__set(),mysql连接数据库1. 什么是类 ?什么是对象?举例说明 答:类是对象的模板,对象是类的一个实 ...

  4. Kotlin - 类与构造器

    类是什么? 类是一个抽象的概念,是具有某些特征的事物的概括,不特定指代任何一个具体的事物.写法: class <类名> {<成员> } Number(Int.Float.Byt ...

  5. Eclipse中快速为类提供构造器、get()、set()方法、重写toString()、hasCode()、equals()等

    当我们写一个类的时候,经常会写构造器,get().set()方法等,以及打印类的信息需要重写toString方法等.这些eclipse已经为我们提供好了,只需直接点击输出即可.方法如下: Eclips ...

  6. String类及其构造器和常用方法

    String类时lang包的内置类,使用时不需要引用. 一.构造器 String():通过new方法创建字符串 String(byte[] byte):把字节数字转换为字符串 异同比较: String ...

  7. Python10/22--面向对象编程/类与对象/init函数

    类: 语法: class关键字 类名# 类名规范 大写开头 驼峰命名法class SHOldboyStudent: # 描述该类对象的特征 school = "上海Oldboy" ...

  8. java类的构造器可以被继承吗_java可以继承父类构造器吗

    子类继承了父类,若父类的构造方法没有重载,那么,子类的构造方法也不需要通过super调用父类构造方法.一个类中如果构造方法重写了并且带了参数,那么这个类的原来系统默认的无参构造方法便消失.由此,若一个 ...

  9. JAVA构造器、静态上下文的执行时机与代码执行顺序详解

    先看代码案例 package com.exemple.demo.test.preciate;public class Father {private int i = test();private st ...

最新文章

  1. 我们用Windows官方跑了跑Linux GUI应用程序,不愧是“胶水操作系统”
  2. Linux中设置服务自启动的三种方式(转)
  3. 扩展SpringMVC WebMvcConfigurerAdapter ||全面接管SpringMVC @EnableWebMvc
  4. Java语言特性运用:各种Java语法特性是怎样被Spring各种版本巧妙运用的?
  5. ubuntu7.10下的vi用的怪怪的
  6. html点赞插件,chrome空间自动点赞插件。浏览器插件简单例子。
  7. UVA11988 Broken Keyboard (a.k.a. Beiju Text)【输入输出+水题】
  8. 百度竞价排名曝光_企业入驻百度爱采购必须选好本地运营服务商
  9. LVS+Keepalived 高可用环境部署记录(主主和主从模式)
  10. Atitit. 构造ast 语法树的总结attilax oao
  11. MVC自定义路由的配置,必须把自己的路由写在前面
  12. 数据库字典收集整理,设计数据表时可拿来查考
  13. (附源码)小程序 记账微信小程序 毕业设计 180815
  14. 外卖cps淘客项目,一个被动引流躺着赚钱的玩法
  15. 镁光ddr3布线规则_讨论一下DDR3 缓存的电压和频率
  16. win10远程桌面连接
  17. 12级软件测试课程博客汇总
  18. TAPD使用方法学习
  19. java实现微信朋友圈点赞统计,微信朋友圈点赞测试用例
  20. 移动 APP 网络优化概述

热门文章

  1. 按键 使用WinHttp实现POST方式用户模拟登录网站
  2. VC6中使用内存DC加载并显示JPG图片的注意事项
  3. 顺序容器STL::list用法
  4. element-ui 设置table width %百分比
  5. [react] 请说说什么是useRef?
  6. [软技能] 请说说使用iconfont图标的优点和缺点
  7. [vue-cli]vue-cli3你有使用过吗?它和2.x版本有什么区别?
  8. 工作160:总结VUE几种页面刷新方法
  9. 前端学习(1885)vue之电商管理系统电商系统之首页路由的重定向
  10. 前端学习(759):预解析案例