html中init是什么作用,HTML5教程:精讲__init__、__new__、__call__方法(可面试用)
原标题:HTML5教程:精讲__init__、__new__、__call__方法(可面试用)
任何事物都有一个从创建,被使用,再到消亡的过程,在程序语言面向对象编程模型中,对象也有相似的命运:创建、初始化、使用、垃圾回收,不同的阶段由不同的方法(角色)负责执行。
在面试的时候,问到面向对象免不了会问__init__、__new__、__call__ 方法这几个最常用的魔术方法。在这里为大家厘清这几个方法的用法:
1. __init__方法
__init__方法负责对象的初始化,系统执行该方法前,其实该对象已经存在了,要不然初始化什么东西呢?先看例子:
class Dog:
def __init__(self):
print("__init__ ")
super(A, self).__init__()
def __new__(cls):
print("__new__ ")
return super(A, cls).__new__(cls)
def __call__(self): # 可以定义任意参数
print('__call__ ')
Dog()
输出结果为:
__new__
__init__
从输出结果来看,__new__方法先被调用,返回一个实例对象,接着__init__被调用。__call__方法并没有被调用,这个我们放到最后说,先来说说前面两个方法,稍微改写成:
def __init__(self):
print("__init__ ")
print(self)
super(A, self).__init__()
def __new__(cls):
print("__new__ ")
self = super(A, cls).__new__(cls)
print(self)
return self
输出为:
__init__
从输出结果来看,__new__ 方法的返回值就是类的实例对象,这个实例对象会传递给 __init__ 方法中定义的 self 参数,以便实例对象可以被正确地初始化。
如果 __new__ 方法不返回值(或者说返回 None)那么 __init__ 将不会得到调用,这个也说得通,因为实例对象都没创建出来,调用 init 也没什么意义,此外,Python 还规定,__init__ 只能返回 None 值,否则报错。
__init__方法可以用来做一些初始化工作,比如给实例对象的状态进行初始化:
def __init__(self, a, b):
self.a = a
self.b = b
super(A, self).__init__()
另外,__init__方法中除了self之外定义的参数,都将与__new__方法中除cls参数之外的参数是必须保持一致或者等效。
class B:
def __init__(self, *args, **kwargs):
print("init", args, kwargs)
def __new__(cls, *args, **kwargs):
print("new", args, kwargs)
return super().__new__(cls)
B(1, 2, 3)
# 输出
new (1, 2, 3) {}
init (1, 2, 3) {}
2. __new__ 方法
一般我们不会去重写该方法,除非你确切知道怎么做,什么时候你会去关心它呢,它作为构造函数用于创建对象,是一个工厂函数,专用于生产实例对象。著名的设计模式之一,单例模式,就可以通过此方法来实现。
class DatabasePools:
_singleton = None
def __new__(cls, *a, **k):
if not cls._singleton:
cls._singleton = object.__new__(cls, *a, **k)
return cls._singleton
这就是通过__new__方法是实现单例模式的的一种方式,如果实例对象存在了就直接返回该实例即可,如果还没有,那么就先创建一个实例,再返回。
小结:
__ new__ 用于创建一个对象,有返回值;__new__是类方法;__ init__ 用于初始化对象,没有返回值
__new__默认参数是cls,系统传递的是类名,__init__默认参数是self,系统传递的是当前对象
__ new__ 先于__ init__ 执行
3. __call__ 方法
关于 __call__ 方法,不得不先提到一个概念,就是可调用对象(callable),我们平时自定义的函数、内置函数和类都属于可调用对象,但凡是可以把一对括号()应用到某个对象身上都可称之为可调用对象,判断对象是否为可调用对象可以用函数 callable
如果在类中实现了 __call__ 方法,那么实例对象也将成为一个可调用对象,我们回到最开始的那个例子:
a = Dog()
print(callable(a)) # True
a是实例对象,同时还是可调用对象,那么我就可以像函数一样调用它。试试:
a() # __call__
很神奇不是,实例对象也可以像函数一样作为可调用对象来用,那么,这个特点在什么场景用得上呢?这个要结合类的特性来说,类可以记录数据(属性),而函数不行(闭包某种意义上也可行),利用这种特性可以实现基于类的装饰器,在类里面记录状态,比如,下面这个例子用于记录函数被调用的次数:
class Counter:
def __init__(self, func):
self.func = func
self.count = 0
def __call__(self, *args, **kwargs):
self.count += 1
return self.func(*args, **kwargs)
@Counter
def foo():
pass
for i in range(10):
foo()
print(foo.count) # 10返回搜狐,查看更多
责任编辑:
html中init是什么作用,HTML5教程:精讲__init__、__new__、__call__方法(可面试用)相关推荐
- html中井号的作用,html5 css选择器 井号, 句点的区别
一.理解CSS的样式组成CSS里的样式表是有规则组成的,每条规则有三个部分组成: 1.选择器(如下面例子中的:"body"),告诉浏览器文档的哪个部分受规则影响: 2.属性(如实例 ...
- html5中footer元素的作用,html5 footer标签怎么用?footer标签的用法实例
本篇文章主要的为大家介绍了关于HTML5 footer标签的使用方法,有布局之类的知识,纯html编辑,不需要会css,好了,现在让我们来看看这篇关于html5 footer标签的文章吧 首先我们先看 ...
- HTML5语音标签和作用,HTML5标签:source元素的使用方法及作用
html元素 标签是html5中新增的标签,主要用于指定音频.视频.图片类型的媒体资源.有关 标签的使用方法及作用详解如下: 标签的定义 标签是为.和标签指定多个媒体资源,比如音频.视频.图片. 标签 ...
- 站长在线Python教程精讲:在Python函数中的局部变量详解
欢迎你来到站长在线的站长学堂学习Python知识,本文学习的是<在Python函数中的局部变量详解>.本文的主要内容有:变量的作用域的概念.局部变量的概念.局部变量的举例. 目录 1.变量 ...
- 站长在线Python教程精讲:在Python函数中的关键字参数详解
欢迎你来到站长在线的站长学堂学习Python知识,本文学习的是<在Python函数中的关键字参数详解>.本文的主要内容有:关键字参数的含义和关键字参数的应用举例. 目录 1.关键字参数的含 ...
- 3个5相乘列乘法算式_新人教版四年级数学上册4.2因数中间或末尾有0的乘法精讲...
电子课本 图文讲解 同步练习 参考答案 导学案 教学设计 教学内容 三位数乘两位数(因数的中间或末尾有0).(教材第48~50页) 教学目标 1.使学生进一步认识"0"在乘法运算中 ...
- 软考网管教程精讲之提高交换机网络整体效率
离2017年下半年软考网络管理员考试只有4个多月的时间了.大家都在找各种复习资料吧!下面是希赛小编为大家整理了一些软考网络管理员知识点,下文主讲提高交换机网络整体效率.希望能帮助各位学员. 提高交换机 ...
- 计算机考试网络管理员课程,软考网络管理员教程精讲之计算机的基本结构
离2017年下半年软考网络管理员考试只有4个多月的时间了.大家都在找各种复习资料吧!下面是希赛小编为大家整理了一些软考网络管理员知识点,下文主讲计算机的基本结构.希望能帮助各位学员. 1.计算机的基本 ...
- 软考网络管理员教程精讲之文件链接命令
离2017年下半年软考网络管理员考试只有半年的时间了.大家都在找各种复习资料吧!下面是希赛小编为大家整理了一些软考网络管理员知识点,下文主讲文件链接命令.希望能帮助各位学员. 文件链接命令 红旗Lin ...
最新文章
- RecycleView的notifyItemRemoved使用注意
- linux 怎么配置apache,在Linux下配置Apache Web服务
- 搜索引擎学习(五)Lucene操作索引
- IIS与ASP.NET管道
- sql number转varchar_MySQL 指南之 SQL 语句基础
- 【kafka】kafka 2.3 版本的kafka topic 分区扩容
- C# 6.0 的那些事
- MYSQL PGA SGA设置
- [翻译]Visual Odmetry from scratch - A tutorial for beginners
- 爱默生电梯维修服务器,爱默生电梯故障代码及导致原因和解决方法
- Exchange邮箱数据库事务日志引起磁盘暴涨
- VScode安装并设置SVN插件
- 计算机网络:数据链路层
- 多点相册--将手机的照片和视频备份到电脑的工具
- 一切都好,只是很想念
- 简单通用QQ/微信跳转浏览器打开代码
- Hadoop之——Hadoop3.x端口变动
- 互换性与测量技术基础复习题及答案
- 优链时代入围Internet Deep 【2022元宇宙TOP500】榜!
- proble tip