python中的__init__ 、__new__、__call__小结


Posted in Python onApril 25, 2014

1.__new__(cls, *args, **kwargs)  创建对象时调用,返回当前对象的一个实例;注意:这里的第一个参数是cls即class本身
2.__init__(self, *args, **kwargs) 创建完对象后调用,对当前对象的实例的一些初始化,无返回值,即在调用__new__之后,根据返回的实例初始化;注意,这里的第一个参数是self即对象本身【注意和new的区别】
3.__call__(self,  *args, **kwargs) 如果类实现了这个方法,相当于把这个类型的对象当作函数来使用,相当于 重载了括号运算符
 

看具体的例子:

class O(object):
    def __init__(self, *args, **kwargs):
        print "init"
        super(O, self).__init__(*args, **kwargs)
    def __new__(cls, *args, **kwargs):
        print "new", cls
        return super(O, cls).__new__(cls, *args, **kwargs)
    def __call__(self,  *args, **kwargs):
        print "call"
       
    oo = O()
    print "________"
    oo() 

打印出来的是:
new
init
________
call

比如:Python Singleton(单例模式)实现,那我们是不是只是重载一些__new__方法就可以了
class Singleton1(object):
    """ 重载new方法"""
    def __new__(cls, *args, **kwargs):
        if not "_instance" in vars(cls):
            cls._instance = super(Singleton1, cls).__new__(cls, *args, **kwargs)
        return cls._instance

可不可以重载__init__方法呢?明显不可以,因为__init__之前调用了__new__方法,这时候已经生成了一个对象了,没办法实现单例模式

Python 相关文章推荐
python添加模块搜索路径方法
Sep 11 Python
使用pandas对矢量化数据进行替换处理的方法
Apr 11 Python
pandas 两列时间相减换算为秒的方法
Apr 20 Python
好的Python培训机构应该具备哪些条件
May 23 Python
Anaconda 离线安装 python 包的操作方法
Jun 11 Python
Django框架模板的使用方法示例
May 25 Python
Python内建序列通用操作6种实现方法
Mar 26 Python
Python学习工具jupyter notebook安装及用法解析
Oct 23 Python
利用python查看数组中的所有元素是否相同
Jan 08 Python
基于Python的接口自动化unittest测试框架和ddt数据驱动详解
Jan 27 Python
python 通过使用Yolact训练数据集
Apr 06 Python
解决python存数据库速度太慢的问题
Apr 23 Python
Python yield 小结和实例
Apr 25 #Python
python计数排序和基数排序算法实例
Apr 25 #Python
python处理圆角图片、圆形图片的例子
Apr 25 #Python
python实现的阳历转阴历(农历)算法
Apr 25 #Python
Python实现的简单万年历例子分享
Apr 25 #Python
python实现simhash算法实例
Apr 25 #Python
python实现DNS正向查询、反向查询的例子
Apr 25 #Python
You might like
laravel框架语言包拓展实现方法分析
2019/11/22 PHP
javascript的键盘控制事件说明
2008/04/15 Javascript
javaScript checkbox 全选/反选及批量删除
2010/04/28 Javascript
细说浏览器特性检测(2)-通用事件检测
2010/11/05 Javascript
JS实现点击图片在当前页面放大并可关闭的漂亮效果
2013/10/18 Javascript
jquery批量设置属性readonly和disabled的方法
2014/01/24 Javascript
LABjs、RequireJS、SeaJS的区别
2014/03/04 Javascript
Javascript玩转继承(三)
2014/05/08 Javascript
js 左右悬浮对联广告特效代码
2014/12/12 Javascript
30个经典的jQuery代码开发技巧
2014/12/15 Javascript
node.js中的fs.truncateSync方法使用说明
2014/12/15 Javascript
实例详解AngularJS实现无限级联动菜单
2016/01/15 Javascript
详解JavaScript中的自定义事件编写
2016/05/10 Javascript
jQuery获取及设置表单input各种类型值的方法小结
2016/05/24 Javascript
AngularJS实现在ng-Options加上index的解决方法
2016/11/03 Javascript
webuploader模态框ueditor显示问题解决方法
2016/12/27 Javascript
基于vue实现分页/翻页组件paginator示例
2017/03/09 Javascript
Bootstrap缩略图的创建方法
2017/03/22 Javascript
Vue + Vue-router 同名路由切换数据不更新的方法
2017/11/20 Javascript
vue实现按需加载组件及异步组件功能
2019/05/27 Javascript
JavaScript基础之this和箭头函数详析
2019/09/05 Javascript
如何手写一个简易的 Vuex
2020/10/10 Javascript
Python 调用DLL操作抄表机
2009/01/12 Python
简单谈谈Python中的元祖(Tuple)和字典(Dict)
2017/04/21 Python
pandas去除重复列的实现方法
2019/01/29 Python
分析经典Python开发工程师面试题
2019/04/08 Python
Python OS模块实例详解
2019/04/15 Python
Python数组拼接np.concatenate实现过程
2020/04/18 Python
详解HTML5中download属性的应用
2015/08/06 HTML / CSS
老海军美国官网:Old Navy
2016/09/05 全球购物
Under Armour西班牙官网:美国知名的高端功能性运动品牌
2018/12/12 全球购物
C#面试常见问题
2013/02/25 面试题
商务日语专业自荐信
2014/04/17 职场文书
节水口号标语
2014/06/19 职场文书
2014最新离职证明范本
2014/09/12 职场文书
中小学生安全教育观后感
2015/06/17 职场文书