首页 > 编程语言 >python中的可执行/调用对象有哪些?

python中的可执行/调用对象有哪些?

时间:2024-04-03 13:58:26浏览次数:27  
标签:__ 执行 code 哪些 python object 生成器 调用 pyc

       本文探讨一下pyhton中可执行/调用的对象有哪些?

       大家首先想到的是函数/方法,但除了函数/方法之外,还有其他的对象是可执行/调用的,大家都了解吗?任何一个可执行对象都有一个code object,它是一个字节码序列,python虚拟机解释执行的就是字节码。

        可执行的对象除了函数/方法之外,还有模块(module)、类(class)、生成器、协程、异步生成器。

        既然可执行对象都有一个code object,那它在哪呢?本文将揭开它们的面纱。

        先看模块,大家都知道执行一个模块或者导入一个模块,都要执行那个模块,那它的code object在哪?稍微有点经验的pythoner都知道python解释器在执行模块前,先要编译模块生成一个pyc文件,模块的code object就在pyc文件中,先看pyc文件的格式

        Magic Number、Bit Field、Last Modified Time、File Size这四个字段各占4个字节,构成了pyc文件的Header,接下来的便是module的code object了。

       下面给出一个解析pyc文件的函数:

import sys, time, struct, dis

def parse(pyc):
    with open(pyc, "rb") as fp:
        #resolve header
        magic = struct.unpack("<l", fp.read(4))[0]
        bitfield = fp.read(4)
        modtime = time.asctime(time.localtime(struct.unpack("<l", fp.read(4))[0]))
        filesize = struct.unpack("<L", fp.read(4))[0]
        print("magic: ", magic, "bit field: ", bitfield, "modified time: ", modtime, "file size: ", filesize)
        #resolve code object
        code = fp.read()
        dis.dis(code)


if __name__ == '__main__':
    parse(sys.argv[1])

       执行时候把pyc文件的路径名传入,便可以查看pyc文件的Header和它code object的字节码了。如果你的python源文件没有生成对应的pyc文件,可以执行python -m compileall xx.py来生成。

       再来看类的code object在哪。直接上代码:

import dis
cls = '''
class x:
    def __init__(self):pass
    def f(self):pass
...
dis.dis(cls)

       看执行结果:


      看类x的code object里的字节码,它的逻辑也就是把类的__module__、__qualname__、__init__、f等属性对象装入到一个namespace中,可见执行一个类,生成一个类对象,它首先就是在做一个打包工作,把类体里面定义的各个对象打包到一个字典里面,了解元编程的朋友知道,后续python解释器会把它作为参数传入元类的构造函数里,元类调用之后返回的就是生成的类对象。

       函数、生成器和异步生成器的code object对象在函数/生成器函数/异步生成器函数的__code__.co_code属性中,不再赘述。

标签:__,执行,code,哪些,python,object,生成器,调用,pyc
From: https://blog.csdn.net/weixin_40756114/article/details/137341300

相关文章

  • python使用request发送x-www-form-urlencoded类型的数据
    场景:当接口的Content-Type类型是x-www-form-urlencoded,使用json类型去请求,无法请求成功解决方法:使用parse.urlencode()方法对json数据进行解码处理,再传入。实例代码如下:importrequestsfromurllibimportparsesession=requests.session()headers={"Content-Type":"app......
  • 为Python应用选择最好的Docker镜像 转载
    在使用Python的早些年,为了解决Python包的隔离与管理virtualenvwrapper就成为我的工具箱中重要的一员。后来,随着Python3的普及,virtualenvwrapper逐渐被venv所替换。毕竟venv是Python3的标配,优点是显而易见的。而这几年,应用场景的的复杂性越来与高,无论是开发还是部......
  • 你在项目中做过哪些安全防范措施?,解密前端开发常见误区
    XSS攻击按照之前说的思路,先讲概念,说用途什么是XSS攻击XSS即CrossSiteScripting(跨站脚本攻击),指的是攻击者想尽一切办法将一些可执行的代码注入到网页中,利用这些恶意脚本,攻击者可获取用户的敏感信息如Cookie、SessionID等,进而危害数据安全。为了不和层叠样式表CSS......
  • 【经典算法】LeetCode 21:合并两个有序链表Java/C/Python3实现含注释说明,Easy)
    合并两个有序链表题目描述思路及实现方式一:迭代(推荐)思路代码实现Java版本C语言版本Python3版本复杂度分析方式二:递归(不推荐)思路代码实现Java版本C语言版本Python3版本复杂度分析总结相似题目标签:字符串处理、前缀判断题目描述将两个升序链表合并为一个新的升......
  • 在ros1系统中python脚本加入到ros工程包中
    一、创建工程目录mkdir-ptestpython/src 二、创建软件包cd testpython/srccatkin_create_pkgmydemorospyrosmsgroscpp此时可以看到mydemo目录被创建,且出现了package.xml和CMakeLists.txt 三、编写python脚本cd mydemo/srcmkdirscriptsvimdemo.py #写你自......
  • appium的使用--python
    介绍Appium是一个自动化开源工具,支持iOS、Android和Windows桌面平台上的原生、移动Web和混合应用的自动化。属于UI测试,用来模拟手工测试。优势(1)解放双手,但并不完全解放双手,需要手动辅助,并不是100%的自动化。(2)节省大量时间,可无人看管情况下运行,在流程结......
  • (保姆级)webserver的创建、部署、调用(使用.net core web+.net core Api+Linxu实现)
    ​版本为Vs2022框架.net6一、webserver的创建参考链接:netcore建立webservice项目_.netcorewebservice-CSDN博客该参考链接作者使用的是.net5,这边是.net6在框架上还是有点小区别的1、使用.netcoreweb创建web服务 2、通过NuGet安装SoapCore 3、创建业务服务文......
  • python 面试题练习总结
    python搜索模块的顺序为:内建模块>当前路径,即执行Python脚本文件所在的路径>环境变量中的PYTHONPATH>python安装路径,故答案为C一、导入模块的搜索顺序:(1)首先导入内建模块。首先判断这个module是不是built-in即内建模块,如果是内建模块则引入内建模块,如果不是则在一个称为sys.pat......
  • Python机器学习实验 数据处理之Numpy
    一、实验目的1.了解numpy库的基本功能2.掌握Numpy库的对数组的操作与运算二、实验工具:1.Anaconda2.Numpy三、Numpy简介Numpy的英文全称为NumericalPython,指Python面向数值计算的第三方库。Numpy的特点在于,针对Python内建的数组类型做了扩充,支持更高维度的数......
  • python数据类型内置方法(部分明天补充)
    1.整型内置a.+加法,调用的内部的add函数b.类型强制转换可以将符合整数格式的字符串转换成整数类型只能转换符合整数格式的字符串c.进制转换oct()八进制hex()十六进制bin()二进制d.int也支持进制转换,其他进制转为十进制eg:print(int('ob1101',2))2.浮点数......