元编程专项测试
考察知识点
- 元类:type元类、自定义元类、new__与__init
- 动态属性创建:getattr、setattr、delattr
- 描述器协议:get、set、delete、描述器类型
- 代码动态生成:exec、eval、compile函数、AST操作
在Python中,使用obj.__dict__直接访问实例属性字典和使用setattr(obj, 'attr', value)设置属性,有什么本质区别?
关于Python中动态管理对象属性的方法,以下说法正确的有:
Python的__slots__机制通过禁止_____________________创建来优化内存使用。定义__slots__的类,实例属性存储在预分配的______描述符中,而不是动态字典。这减少了每个实例的内存开销,但代价是失去动态添加属性的能力。如果需要在继承链中使用__slots__,除非父类已定义__slots__,否则子类仍会隐式创建_____________________,除非显式定义空的__slots__ = ()。
Python的types.CodeType对象包含编译后的字节码及相关信息。以下哪个属性包含了实际的字节码指令序列?
关于Python的compile()函数,以下说法正确的有:
Python字节码指令有两种格式:无参数指令占______字节,有参数指令占______或!!4!!字节。使用dis模块可以反汇编Code Object。dis.dis(func)会显示每条指令的行号、指令偏移、操作码名称和参数。例如LOAD_CONST 1表示从常量表索引______处加载常量。Python 3.11引入了快速指令(如LOAD_FAST_LOAD_FAST)来优化常见组合操作的执行效率。
Python的ast模块提供了抽象语法树解析功能。以下哪种方式可以获取Python源代码的AST?
关于使用ast模块遍历和修改AST,以下说法正确的有:
AST抽象语法树在实际开发中有多种应用:代码静态分析工具(如______、flake8)使用AST检查代码风格和潜在错误;代码覆盖率工具(如coverage.py)使用AST分析代码结构;代码重构工具可以遍历AST进行批量重命名。自定义AST分析器可以通过继承_______________实现代码审查、提取函数调用关系、检测安全漏洞等功能。修改AST后需要调用________________________修复行号信息,否则编译会失败。
Python中type既是函数又是元类。关于type的两种用法,以下描述正确的是:
使用type(name, bases, dict)动态创建类时,各参数的含义和作用是:
元类可以通过定义________________________方法来控制类命名空间的创建。__prepare__(name, bases)返回一个映射对象(通常是字典),用于存储类体中定义的属性。Python 3中默认的命名空间是普通字典,但可以返回___________来保持属性定义顺序,或返回自定义映射类型实现特殊功能(如拦截属性赋值)。类体执行完成后,命名空间传递给元类的____________________和__init__方法完成类的创建。
关于eval()和exec()的安全风险,以下描述正确的是:
关于安全的动态执行替代方案,以下说法正确的有:
构建受限执行环境需要控制多个入口点:设置globals字典时,将________________________设为空字典或受限字典,移除import、open、eval等危险函数。但仅限制builtins不够,因为Python对象可以通过__class__.__base__.__subclasses__()访问到______,包括能执行系统命令的类。更彻底的方案是使用________________库,它会在编译阶段将危险语法转换为安全形式,或者使用沙箱进程隔离执行。
创建自定义元类时,应该继承哪个类,并主要实现哪些方法?
自定义元类在实际开发中的常见应用包括:
自定义元类的三个核心方法有不同调用时机:__prepare__在类体执行______调用,用于准备命名空间;__new__在类体执行______调用,接收完整的命名空间并创建类对象;__init__在__new__返回类对象______调用,用于初始化类对象。如果元类定义了__call__,则在创建类的实例时被调用,可以控制实例化过程(如实现单例)。
关于Python中__new__和__init__的区别,以下描述正确的是:
__new__方法在实际开发中的应用场景包括:
📝 发现内容有误?点击此处直接编辑
长按或扫描二维码,立即体验