__new__: 对象的创建,是一个静态方法。第一个參数是cls。(想想也是,不可能是self,对象还没创建,哪来的self)

__init__ : 对象的初始化, 是一个实例方法,第一个參数是self

__call__ : 对象可call。注意不是类,是对象。

先有创建,才有初始化。即先__new__,而后__init__。

上面说的不好理解,看样例。

对于__new__

class Bar(object):
pass class Foo(object):
def __new__(cls, *args, **kwargs):
return Bar() print Foo()

能够看到,输出来是一个Bar对象。

__new__方法在类定义中不是必须写的。假设没定义,默认会调用object.__new__去创建一个对象。假设定义了。就是override,能够custom创建对象的行为。

聪明的读者可能想到,既然__new__能够custom对象的创建,那我在这里做一下手脚,每次创建对象都返回同一个。那不就是单例模式了吗?没错,就是这样。能够观摩《飘逸的python - 单例模式乱弹

定义单例模式时。由于自己定义的__new__重载了父类的__new__。所以要自己显式调用父类的__new__。即object.__new__(cls, *args, **kwargs),或者用super()。,不然就不是extend原来的实例了,而是替换原来的实例。

对于__call__

class Foo(object):
def __call__(self):
pass f = Foo()#类Foo可call
f()#对象f可call

总结,在python中。类的行为就是这样。__new__、__init__、__call__等方法不是必须写的,会默认调用,假设自定义了。就是override,能够custom。既然override了,通常也会显式调用进行补偿以达到extend的目的

这也是为什么会出现"明明定义def _init__(self, *args, **kwargs)。对象怎么不进行初始化"这样的看起来诡异的行为。(注,这里_init__少写了个下划线,由于__init__不是必须写的,所以这里不会报错。而是当做一个新的方法_init__)

飘逸的python - __new__、__init__、__call__傻傻分不清的更多相关文章

  1. 类和对象的创建过程(元类,__new__,__init__,__call__)

    一. type() 1.创建类的两种方式 方式一 class MyClass(object): def func(self,name): print(name) myc = MyClass() pri ...

  2. python __new__ __init__ __del__

    1.python实例化顺序是.__new__ -->__init__ --> __del__ 2.如果重写new没return,就实例化不成功

  3. python 创建类先执行metaclass父类__new__ > __init__>__call__ 然后再执行自己的__new__>__init__

    class MyType(type): def __init__(self,*args,**kwargs): print("Mytype __init__",*args,**kwa ...

  4. python __new__ __init__

    写过python类的都会知道__init__,可能也了解__new__.我之前也了解__new__,但只做的它发生在__init__之前.其他的就比较模糊了 今天在学习单例模式时,看到有人用__new ...

  5. python __new__ __init__ 区别

    参数 __new__的第一个占位参数是class对象 __init__的第一个占位参数是class的实例对象 其他的参数应一致 作用 __new__ 用来创建实例,在返回的实例上执行__init__, ...

  6. python中的__init__ 、__new__、__call__小结

    这篇文章主要介绍了python中的__init__ .__new__.__call__小结,需要的朋友可以参考下 1.__new__(cls, *args, **kwargs)  创建对象时调用,返回 ...

  7. 简述 Python 类中的 __init__、__new__、__call__ 方法

    任何事物都有一个从创建,被使用,再到消亡的过程,在程序语言面向对象编程模型中,对象也有相似的命运:创建.初始化.使用.垃圾回收,不同的阶段由不同的方法(角色)负责执行. 定义一个类时,大家用得最多的就 ...

  8. 简析 __init__、__new__、__call__ 方法

    简析 __init__.__new__.__call__ 方法 任何事物都有一个从创建,被使用,再到消亡的过程,在程序语言面向对象编程模型中,对象也有相似的命运:创建.初始化.使 用.垃圾回收,不同的 ...

  9. __init__、__new__、__call__ 方法

    __init__方法 __init__方法负责对象的初始化,系统执行该方法前,其实该对象已经存在了,要不然初始化什么东西呢?先看例子: # class A(object): python2 必须显示地 ...

随机推荐

  1. JS - 焦点图

    下载地址:http://www.lanrentuku.com/js/jiaodiantu-1076.html 修改焦点图: CSS代码: /* 懒人图库 搜集整理 www.lanrentuku.com ...

  2. JSP自定义标签——简单标签(2)

    在前一篇博客中,我们已经学习了自定义的简单标签的基本使用方法,这一篇我们来学习如何在简单标签中添加标签属性.对自定义标签添加一些属性,可以使我们的标签功能更加灵活和复用.例如前一篇博客使用简单标签来对 ...

  3. clientdataset<---->json

    现在,DATASNAP倾向于使用JSON作为统一的数据序列格式,以期达到跨平台的效果.于是使用JSON便成为热点. unit uJSONDB;   interface uses SysUtils, C ...

  4. 用js实现插入排序

    话不多说,直接上代码 html源码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" " ...

  5. uva 10603

    紫皮书的例题 照着敲了一遍,非原创 大题思路主要是三杯水,而水的总数是知道的,相当于知道第一第二杯水的体积,第三杯水的体积也就确定了. 用第一第二杯水的体积来标记数组是否遍历过 优先队列来找移动体积最 ...

  6. json介绍及简单示例

    JSON的定义: 一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性.业内主流技术为其提供了完整的解决方案(有点类似于正则表达式 ,获得了当今大部分语言的支持),从而可以在不同平台间进行数据 ...

  7. Android CTS 结果 testResult.xml 修改 fail 项 为 notExecuted 项 分析

    这两天一直在搞 Android 4.1 CTS ,每次完整跑完一遍后总有几百项 failed,用编辑器手动改为 notExecuted 项后重新跑,有很多项第二次都跑过了. 但是发现直接修改也带来很多 ...

  8. cape town

    开普敦_百度百科 开普敦

  9. 用代码定位硬盘上的文件(使用ShellExecute执行explorer /select命令,其它参数也很全)

    问题:如何用代码控制资源浏览器,并定位到指定的文件? 答:使用ShellExecute,配合explorer即可 ShellExecute(Application.Handle, 'open', PC ...

  10. Delphi实现窗口一直在桌面工作区内显示(重写WM_WINDOWPOSCHANGING消息)

    有的时候我们要实现一个悬浮窗口,并使该窗口一直显示在桌面的工作区内.即整个窗口要一直显示在屏幕上,不能超出屏幕的上下左右边缘.此功能的实现也不难,我们需要自己写代码来响应窗口的WM_WINDOWPOS ...