类的构造器-init和new
提到构造器,大家都会想到 __init__,那么__new__是什么?也是构造器。
init 构造器
都很熟悉了,直接上代码
class MyClass(object):
def __init__(self):
pass def 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=a
def __new__(cls,*args, **kwargs):
print "new %s"%cls
print('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 相当于 self
print(1)
return float.__new__(cls, arg * 0.0254)
def __init__(self, aa):
print('aa:', aa)
print(2) a = inch(12) # new 和 init 公用了参数12
#
# ('aa:', 12)
#
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 相当于 self
print(11)
return float.__new__(cls, arg)*0.0254 # 返回了父类的实例*0.0254
def __init__(self,aa):
print(22) # 这句没有被执行,因为new没有正确返回父类的实例 a = inch2(12)
#
print(a)
# 0.3048 =12*0.0254
new没有正确返回父类的实例,导致init没有被执行。
类的构造器-init和new的更多相关文章
- 类的构造器[constructor]_C#
类的构造器(constructor): 1. 先看两个类定义: class A{ } 相当于: class A: object { Public A ( ) : base( ) { } ...
- Java8自定义函数式编程接口和便捷的引用类的构造器及方法
什么是函数编程接口? 约束:抽象方法有且只有一个,即不能有多个抽象方法,在接口中覆写Object类中的public方法(如equal),不算是函数式接口的方法. 被@FunctionalInterfa ...
- Scala类的构造器与访问器
1.构造器 在Scala中,每个类都有一个主构造器.主构造器与类的定义交织在一起,如下: class Person ( private var _name: String, private var _ ...
- 方法引用_通过this引用本类的成员方法和方法引用_类的构造器(构造方法)引用和数组的构造器引用
package com.yang.Test.ThisMethodReference; /** * 通过this引用本类的成员方法 */ public class Husband { //定义一个买房子 ...
- java使用this关键字调用本类重载构造器
在构造器中可以调用本类的其他重载构造器,不能使用构造器名称来调用另一个构造器,而是应该使用Java特定的this(-.)来调用. this(-.)方法必须出现在构造器中的第一行,用来调用其他重载构造器 ...
- Python10/22--面向对象编程/类与对象/init函数
类: 语法: class关键字 类名# 类名规范 大写开头 驼峰命名法class SHOldboyStudent: # 描述该类对象的特征 school = "上海Oldboy" ...
- Scala基础:类和构造器
类 package com.zy.scala.cls /** * 在 Scala 中,类并不用声明为 public 类型的. * Scala 源文件中可以包含多个类,所有这些类都具有共有可见性. */ ...
- Java 类的构造器中this()和super()的困惑
关于构造器中super的使用,书本上这样写: “super是指向父类的引用,如果构造方法没有显示地调用父类的构造方法,那么编译器会自动为它加上一个默认的super()方法调用.如果父类由没有默认的无参 ...
- 第2节 Scala中面向对象编程:1、类的定义;2、类的构造器;3、object和伴生对象;4、apply和main方法
6. 类.对象.继承.特质 Scala的类与Java.C++的类比起来更简洁,学完之后你会更爱Scala!!! 6.1. 类 6.1.1. 类的定义 package cn.itcast ...
随机推荐
- 学习使用scrapy itemspipeline过程
开始非常不理解from https://www.jianshu.com/p/18ec820fe706 找到了一个比较完整的借鉴,然后编写自己的煎蛋pipeline 首先在items里创建 image_ ...
- Hadoop 配置文件 & 启动方式
配置文件: 默认的配置文件:相对应的jar 中 core-default.xml hdfs-default.xml yarn-default.xml mapred-default.xml 自定义配置文 ...
- js中prototype,constructor的理解
连看4篇前辈的文章,记录一些知识点 Javascript继承机制的设计思想 Javascript 面向对象编程(一):封装 Javascript面向对象编程(二):构造函数的继承 Javascript ...
- Python sqlalchemy orm 多外键关联
多外键关联 注:在两个表之间进行多外键链接 如图: 案例: # 创建两张表并添加外键主键 # 调用Column创建字段 加类型 from sqlalchemy import Integer, For ...
- activiti5/6 系列之--Activiti与BPMN2.0规范相关节点对应关系
根据BPMN2.0规范的分类划分为以下部分: 1.启动与结束事件(event) 2.顺序流(Sequence Flow) 3.任务(Task) 4.网关(Gateway) 5.子流程(Subproce ...
- while(scanf("%d %d",&a,&b)!=EOF)
scanf("%d %d",&a,&b)返回输入的数据和格式字符串中匹配次数.当dos或windows中输入ctrl+z(模拟文件结束符EOF)时,scanf返回E ...
- Zedboard初体验
前言 这是我学习Zedboard时做的笔记 Zedboard是什么 Zedboard是Xilinx公司推出的搭载了Zynq芯片的开发板,其中Zynq芯片采用全新的设计理念,将ARM处理器嵌入FPGA可 ...
- springboot热部署(二)——springboot热部署与发布
一.实现的方式概述 注意以下的热部署方式在IDEA是默认没有打开自动编译的,手动编译需要快捷键(Ctrl+Shift+F9),自动编译的修改配置如下:(注意刷新不要太快,会有1-2秒延迟) File- ...
- Rancher2.0中部署Longhorn分布式存储实验
目录 1.简介 2.实验环境 3.应用商店中部署longhorn 4.创建工作负载,使用longhorn存储 5.查看longhorn UI 6.注意事项 1.简介: Longhorn是Rancher ...
- Archiva 2.2.3 安装运行的时候出现协议版本错误
在 Archiva 安装成功后运行的时候出现协议版本错误: Caused by: javax.net.ssl.SSLException: Received fatal alert: protocol_ ...