python没有运行_Python没有执行__init__
疑惑 提出问题
前天同事问我一个问题,为什么这个脚本中的没有调用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__相关推荐
- python逐行运行_python逐行执行
广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 我已经编写了一些代码来尝试执行以下操作 我之前在python代码中检索过的ope ...
- python单核运行_python下多核,单核CPU对于并行,并发执行效率的对比-Go语言中文社区...
** ** 这篇博客主要内容为python 中多线程以及多进程的效率对比,以及记录自己在做这个实验中遇到的一些问题以及心得 背景引入: CPU制造商为了追求CPU效率放弃了在CPU频率上的追求(CPU ...
- python保存后不运行_Python后台执行不启用缓存
1.运行时加-u参数,如 # python3 -u test.py >> test.log & 用man查看python的-u参数,说明如下: Force stdin, stdou ...
- python安装选项_python设置执行选项参数
1. sys 可以通过sys.argv得到参数列表,其中sys.argv[0]是文件名称,此后的列表值是每一个参数,这里的参数列表也支持常规的列表操作 for data in sys.argv: pr ...
- python多继承_Python多继承,__init__
如果你想在子进程中使用super来调用parent .__ init__和parent2._init__,那么父__init__s也必须调用super: class parent(Base): def ...
- python常驻运行_Python常驻任务实现接收外界参数代码解析
实现一个简单的常驻任务是容易的,写一个while True就可以了,但是同时要能接收外界传来的参数,就稍微有点复杂. 我第一个想到的是网络编程中的server/client模式 server作为常驻进 ...
- python绘制荷花_python解释器执行金额:¥%f 元 % 1.5000 的结果为( )
[单选题]我国卫生细菌学标准规定:每升饮用水中大肠菌群数不得超过 ( ) [单选题]某企业为增值税一般纳税人,适用的增值税税率为16%.该企业委托其他单位(增值税一般纳税人)加工一批属于应税消费品的原 ...
- python爬虫运行正常最后报错_Python爬虫运行正常,最后却报错
问题: Python爬虫运行正常,最后却报错 描述: 刚学Python,不明白,特来请教. 程序是爬取贴吧某个地址的图片,运行正常,图片也都下载下来了. 代码如下:import urllib.requ ...
- python怎么运行_程序员大牛讲解,Python程序的执行原理
人工智能的火热让Python成为近两年来发展最好的开发语言,Python已经被越来越多的人所熟知,Python开发工程师水涨船高的薪资也吸引着更多的人进入这个行业.一名合格的Python工程师怎么能不 ...
最新文章
- 解决Apache 服务器不支持FLV视频播放的办法
- linux下VI模式中上下左右键和回退键出现字母
- jQuery源码研究分析学习笔记-静态方法和属性(10)
- 生成ltx文件命令_利用二次开发工具批量生成PCDMIS程序
- 进程的描述和进程的创建
- 实验4-1-2 求奇数和 (15 分)
- vb ftp linux,一个功能比较完整VB FTP程序+源码
- 联想本win10 virtualbox 安装centos
- java 读取csv文件乱码_java读取csv文件乱码怎么解决
- 数据结构---树和二叉树03
- 继电器——电磁式继电器
- Visual C++注册
- Vscode 设置clang-format
- 注释、标识符、关键字、数据类型、类型转换
- 武汉星起航——卖家关注!亚马逊为促进行业发展,近期有了新动作
- Blockchain技术之区块链的概念和起源以及区块链的运行方式、发展前景和应用领域分析
- JD6606S有TID号的硬件PD协议芯片资料
- python的PyObjC库
- HDU 5239 Doom
- 后台管理页面布局、web页面布局
热门文章
- 预训练生成模型:结合VAE与BERT/GPT-2提高文本生成效果
- CVPR 2020 | 以局部焦点进行渐进式面部表情编辑
- 限时免费 | 人工智能项目实战训练营,给你一个成为AI算法工程师的机会
- 这场论文复现的华山论剑,谁能拔得头筹
- 还在熬夜憋思路?这12篇最新论文打包送给你 | 本周值得读
- ZOJ - 1450 Minimal Circle HDU - 3007 Buried memory 最小圆覆盖模板 【随机函数】【增量法】
- matlab逆变换法产生随机数_matlab中产生随机数的程序
- pythonlist基本操作_Python 列表(list)简介及基本操作
- 网关、负载均衡、服务注册发现什么关系?
- jpa报错No property found for column ‘first_time‘ mapped to field ‘first_time‘