疑惑 提出问题

前天同事问我一个问题,为什么这个脚本中的没有调用A 的__init__。脚本如下:

1 classA(object):2 def __init__(self, *args, **kwargs):3 print "Call init from %s" %self.__class__

4

5 def __new__(cls, *args, **kwargs):6 obj = object.__new__(cls, *args, **kwargs)7 print "Call new from %s" %obj.__class__

8 returnobj9

10

11 classB(object):12 def __init__(self, *args, **kwargs):13 print "Call init from %s" %self.__class__

14

15 def __new__(cls, *args, **kwargs):16 obj = object.__new__(A, *args, **kwargs)17 print "Call new from %s" %obj.__class__

18 returnobj19

20 b = B()

其实我也比较奇怪,这个脚本写的比较奇怪,class B的的__new__返回了A的实例。也只是只执行了B的__new__方法,并没有执行A的__init__方法。

深入 迷失

遇到这个问题:

要深入首先查看了一下代码的编译后的python指令,查看B,是B的__init__方法的指令,

如上图,为了具体查看B()方法是如何调用,就添加了一个方法test_B。B()显示仅仅是两条指令

LOAD_GLOBAL

CALL_FUNCTION

查看Python源代码,到

PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw)

{

ternaryfunc call;

if ((call = func->ob_type->tp_call) != NULL) {

PyObject *result;

if (Py_EnterRecursiveCall(" while calling a Python object"))

return NULL;

result = (*call)(func, arg, kw);

**************看到这里的时候有点迷失了,不知道tp_call是个什么东西了,不确定由typeobject来操作

(这个必须进行检讨因为tp_call已已经明确了他来自哪里)***************

调试 问题解决

最后使出了,大招对Python源代码进行调试,在Linux上编译python源代码加上参数--with-debug, 然后执行gdb -ex r --args python test.py,

在call_function,do_call,PyObject_Call 执行到之后,打上断点。看到他运行到了

type_call(PyTypeObject *type, PyObject *args, PyObject *kwds)

{

obj = type->tp_new(type, args, kwds);

if (obj != NULL) {

if (!PyType_IsSubtype(obj->ob_type, type))

return obj;

,这个时候我再去看代码。发现哪里已经写好注释了:

/* If the returned object is not an instance of type,

it won't be initialized. */

好吧,很明确了了。没有产生和class类型一致的instance,就不会进行初始化。即调用__init__。

问题解决了。。也学习了

要问我怎么知道在那个地方打断点,因为我已经看过了代码,只是理解没有那么深。

python没有运行_Python没有执行__init__相关推荐

  1. python逐行运行_python逐行执行

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 我已经编写了一些代码来尝试执行以下操作 我之前在python代码中检索过的ope ...

  2. python单核运行_python下多核,单核CPU对于并行,并发执行效率的对比-Go语言中文社区...

    ** ** 这篇博客主要内容为python 中多线程以及多进程的效率对比,以及记录自己在做这个实验中遇到的一些问题以及心得 背景引入: CPU制造商为了追求CPU效率放弃了在CPU频率上的追求(CPU ...

  3. python保存后不运行_Python后台执行不启用缓存

    1.运行时加-u参数,如 # python3 -u test.py >> test.log & 用man查看python的-u参数,说明如下: Force stdin, stdou ...

  4. python安装选项_python设置执行选项参数

    1. sys 可以通过sys.argv得到参数列表,其中sys.argv[0]是文件名称,此后的列表值是每一个参数,这里的参数列表也支持常规的列表操作 for data in sys.argv: pr ...

  5. python多继承_Python多继承,__init__

    如果你想在子进程中使用super来调用parent .__ init__和parent2._init__,那么父__init__s也必须调用super: class parent(Base): def ...

  6. python常驻运行_Python常驻任务实现接收外界参数代码解析

    实现一个简单的常驻任务是容易的,写一个while True就可以了,但是同时要能接收外界传来的参数,就稍微有点复杂. 我第一个想到的是网络编程中的server/client模式 server作为常驻进 ...

  7. python绘制荷花_python解释器执行金额:¥%f 元 % 1.5000 的结果为( )

    [单选题]我国卫生细菌学标准规定:每升饮用水中大肠菌群数不得超过 ( ) [单选题]某企业为增值税一般纳税人,适用的增值税税率为16%.该企业委托其他单位(增值税一般纳税人)加工一批属于应税消费品的原 ...

  8. python爬虫运行正常最后报错_Python爬虫运行正常,最后却报错

    问题: Python爬虫运行正常,最后却报错 描述: 刚学Python,不明白,特来请教. 程序是爬取贴吧某个地址的图片,运行正常,图片也都下载下来了. 代码如下:import urllib.requ ...

  9. python怎么运行_程序员大牛讲解,Python程序的执行原理

    人工智能的火热让Python成为近两年来发展最好的开发语言,Python已经被越来越多的人所熟知,Python开发工程师水涨船高的薪资也吸引着更多的人进入这个行业.一名合格的Python工程师怎么能不 ...

最新文章

  1. 解决Apache 服务器不支持FLV视频播放的办法
  2. linux下VI模式中上下左右键和回退键出现字母
  3. jQuery源码研究分析学习笔记-静态方法和属性(10)
  4. 生成ltx文件命令_利用二次开发工具批量生成PCDMIS程序
  5. 进程的描述和进程的创建
  6. 实验4-1-2 求奇数和 (15 分)
  7. vb ftp linux,一个功能比较完整VB FTP程序+源码
  8. 联想本win10 virtualbox 安装centos
  9. java 读取csv文件乱码_java读取csv文件乱码怎么解决
  10. 数据结构---树和二叉树03
  11. 继电器——电磁式继电器
  12. Visual C++注册
  13. Vscode 设置clang-format
  14. 注释、标识符、关键字、数据类型、类型转换
  15. 武汉星起航——卖家关注!亚马逊为促进行业发展,近期有了新动作
  16. Blockchain技术之区块链的概念和起源以及区块链的运行方式、发展前景和应用领域分析
  17. JD6606S有TID号的硬件PD协议芯片资料
  18. python的PyObjC库
  19. HDU 5239 Doom
  20. 后台管理页面布局、web页面布局

热门文章

  1. 预训练生成模型:结合VAE与BERT/GPT-2提高文本生成效果
  2. CVPR 2020 | 以局部焦点进行渐进式面部表情编辑
  3. 限时免费 | 人工智能项目实战训练营,给你一个成为AI算法工程师的机会
  4. 这场论文复现的华山论剑,谁能拔得头筹
  5. 还在熬夜憋思路?这12篇最新论文打包送给你 | 本周值得读
  6. ZOJ - 1450 Minimal Circle HDU - 3007 Buried memory 最小圆覆盖模板 【随机函数】【增量法】
  7. matlab逆变换法产生随机数_matlab中产生随机数的程序
  8. pythonlist基本操作_Python 列表(list)简介及基本操作
  9. 网关、负载均衡、服务注册发现什么关系?
  10. jpa报错No property found for column ‘first_time‘ mapped to field ‘first_time‘