原标题: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__方法(可面试用)相关推荐

  1. html中井号的作用,html5 css选择器 井号, 句点的区别

    一.理解CSS的样式组成CSS里的样式表是有规则组成的,每条规则有三个部分组成: 1.选择器(如下面例子中的:"body"),告诉浏览器文档的哪个部分受规则影响: 2.属性(如实例 ...

  2. html5中footer元素的作用,html5 footer标签怎么用?footer标签的用法实例

    本篇文章主要的为大家介绍了关于HTML5 footer标签的使用方法,有布局之类的知识,纯html编辑,不需要会css,好了,现在让我们来看看这篇关于html5 footer标签的文章吧 首先我们先看 ...

  3. HTML5语音标签和作用,HTML5标签:source元素的使用方法及作用

    html元素 标签是html5中新增的标签,主要用于指定音频.视频.图片类型的媒体资源.有关 标签的使用方法及作用详解如下: 标签的定义 标签是为.和标签指定多个媒体资源,比如音频.视频.图片. 标签 ...

  4. 站长在线Python教程精讲:在Python函数中的局部变量详解

    欢迎你来到站长在线的站长学堂学习Python知识,本文学习的是<在Python函数中的局部变量详解>.本文的主要内容有:变量的作用域的概念.局部变量的概念.局部变量的举例. 目录 1.变量 ...

  5. 站长在线Python教程精讲:在Python函数中的关键字参数详解

    欢迎你来到站长在线的站长学堂学习Python知识,本文学习的是<在Python函数中的关键字参数详解>.本文的主要内容有:关键字参数的含义和关键字参数的应用举例. 目录 1.关键字参数的含 ...

  6. 3个5相乘列乘法算式_新人教版四年级数学上册4.2因数中间或末尾有0的乘法精讲...

    电子课本 图文讲解 同步练习 参考答案 导学案 教学设计 教学内容 三位数乘两位数(因数的中间或末尾有0).(教材第48~50页) 教学目标 1.使学生进一步认识"0"在乘法运算中 ...

  7. 软考网管教程精讲之提高交换机网络整体效率

    离2017年下半年软考网络管理员考试只有4个多月的时间了.大家都在找各种复习资料吧!下面是希赛小编为大家整理了一些软考网络管理员知识点,下文主讲提高交换机网络整体效率.希望能帮助各位学员. 提高交换机 ...

  8. 计算机考试网络管理员课程,软考网络管理员教程精讲之计算机的基本结构

    离2017年下半年软考网络管理员考试只有4个多月的时间了.大家都在找各种复习资料吧!下面是希赛小编为大家整理了一些软考网络管理员知识点,下文主讲计算机的基本结构.希望能帮助各位学员. 1.计算机的基本 ...

  9. 软考网络管理员教程精讲之文件链接命令

    离2017年下半年软考网络管理员考试只有半年的时间了.大家都在找各种复习资料吧!下面是希赛小编为大家整理了一些软考网络管理员知识点,下文主讲文件链接命令.希望能帮助各位学员. 文件链接命令 红旗Lin ...

最新文章

  1. RecycleView的notifyItemRemoved使用注意
  2. linux 怎么配置apache,在Linux下配置Apache Web服务
  3. 搜索引擎学习(五)Lucene操作索引
  4. IIS与ASP.NET管道
  5. sql number转varchar_MySQL 指南之 SQL 语句基础
  6. 【kafka】kafka 2.3 版本的kafka topic 分区扩容
  7. C# 6.0 的那些事
  8. MYSQL PGA SGA设置
  9. [翻译]Visual Odmetry from scratch - A tutorial for beginners
  10. 爱默生电梯维修服务器,爱默生电梯故障代码及导致原因和解决方法
  11. Exchange邮箱数据库事务日志引起磁盘暴涨
  12. VScode安装并设置SVN插件
  13. 计算机网络:数据链路层
  14. 多点相册--将手机的照片和视频备份到电脑的工具
  15. 一切都好,只是很想念
  16. 简单通用QQ/微信跳转浏览器打开代码
  17. Hadoop之——Hadoop3.x端口变动
  18. 互换性与测量技术基础复习题及答案
  19. 优链时代入围Internet Deep 【2022元宇宙TOP500】榜!
  20. proble tip

热门文章

  1. ICCV2021 | 单目3D目标检测框架GUPNet解析
  2. BAT、网易、蘑菇街面试题整理-6
  3. Javaweb-javascript
  4. php 生成ppt,php phppowerpoint
  5. word 2010下,如何批量删除Work的页眉和页脚,然后存为PDF文档
  6. 五大UNIX系统家族族谱
  7. 判断中转页面入口window.performance.navigation.type
  8. vuejs基础之动画
  9. Sublime SystemVerilog安装
  10. linux find按权限查找,如何使用find命令按权限查找文件详解