全部学科
Python全栈
python
NodeJS全栈
nodejs
小程序首页

元编程专项测试

20 题 40 分钟 难度:

考察知识点

  • 元类:type元类、自定义元类、new__与__init
  • 动态属性创建getattrsetattrdelattr
  • 描述器协议getsetdelete、描述器类型
  • 代码动态生成:exec、eval、compile函数、AST操作
1
单选题

在Python中,使用obj.__dict__直接访问实例属性字典和使用setattr(obj, 'attr', value)设置属性,有什么本质区别?

A

setattr会触发属性描述符协议,__dict__直接操作字典不会

B

setattr无法修改只读属性,__dict__可以强制修改

C

使用__dict__赋值的属性不会触发__setattr__方法

D

以上都正确

2
多选题

关于Python中动态管理对象属性的方法,以下说法正确的有:

A

vars(obj)返回对象的__dict__属性字典

B

getattr(obj, 'attr', default)可以在属性不存在时返回默认值

C

delattr(obj, 'attr')会触发__delattr__方法

D

obj.__dict__对所有Python对象都可用

3
填空题

Python的__slots__机制通过禁止_____________________创建来优化内存使用。定义__slots__的类,实例属性存储在预分配的______描述符中,而不是动态字典。这减少了每个实例的内存开销,但代价是失去动态添加属性的能力。如果需要在继承链中使用__slots__,除非父类已定义__slots__,否则子类仍会隐式创建_____________________,除非显式定义空的__slots__ = ()

4
单选题

Python的types.CodeType对象包含编译后的字节码及相关信息。以下哪个属性包含了实际的字节码指令序列?

A

co_code

B

co_consts

C

co_names

D

co_lnotab

5
多选题

关于Python的compile()函数,以下说法正确的有:

A

compile(source, filename, mode)将源代码编译为Code Object

B

mode参数可以是'exec''eval''single'

C

'eval'模式只能编译单个表达式,返回可求值的Code Object

D

编译后的Code Object可以被exec()eval()执行

6
填空题

Python字节码指令有两种格式:无参数指令占______字节,有参数指令占______或!!4!!字节。使用dis模块可以反汇编Code Object。dis.dis(func)会显示每条指令的行号、指令偏移、操作码名称和参数。例如LOAD_CONST 1表示从常量表索引______处加载常量。Python 3.11引入了快速指令(如LOAD_FAST_LOAD_FAST)来优化常见组合操作的执行效率。

7
单选题

Python的ast模块提供了抽象语法树解析功能。以下哪种方式可以获取Python源代码的AST?

A

ast.parse(source)返回AST模块节点

B

ast.dump(node)返回AST结构字符串

C

compile(source, '<string>', 'exec', ast.PyCF_ONLY_AST)返回AST

D

以上都可以获取AST

8
多选题

关于使用ast模块遍历和修改AST,以下说法正确的有:

A

ast.NodeVisitor.visit(node)递归遍历AST节点

B

定义visit_<NodeType>方法可以处理特定类型节点

C

ast.NodeTransformer可以修改并返回新节点

D

修改后的AST需要使用compile()编译才能执行

9
填空题

AST抽象语法树在实际开发中有多种应用:代码静态分析工具(如______、flake8)使用AST检查代码风格和潜在错误;代码覆盖率工具(如coverage.py)使用AST分析代码结构;代码重构工具可以遍历AST进行批量重命名。自定义AST分析器可以通过继承_______________实现代码审查、提取函数调用关系、检测安全漏洞等功能。修改AST后需要调用________________________修复行号信息,否则编译会失败。

10
单选题

Python中type既是函数又是元类。关于type的两种用法,以下描述正确的是:

A

type(obj)返回对象的类型,type(name, bases, dict)创建新类

B

所有类的类型都是type(除了type自己是自己的类型)

C

使用class关键字定义类时,实际上是调用type.__new__type.__init__

D

以上都正确

11
多选题

使用type(name, bases, dict)动态创建类时,各参数的含义和作用是:

A

name是类的名称字符串,成为__name__属性

B

bases是基类元组,可以是空元组()(object,)

C

dict是类属性字典,包含方法、属性和类变量

D

动态创建的类与使用class关键字定义的类完全等价

12
填空题

元类可以通过定义________________________方法来控制类命名空间的创建。__prepare__(name, bases)返回一个映射对象(通常是字典),用于存储类体中定义的属性。Python 3中默认的命名空间是普通字典,但可以返回___________来保持属性定义顺序,或返回自定义映射类型实现特殊功能(如拦截属性赋值)。类体执行完成后,命名空间传递给元类的______________________init__方法完成类的创建。

13
单选题

关于eval()exec()的安全风险,以下描述正确的是:

A

eval()只能执行表达式,但恶意表达式仍可造成危害(如__import__('os').system('rm -rf /')

B

限制globals和locals字典不能完全阻止危险操作

C

使用exec()执行用户输入代码是严重的安全漏洞

D

以上都正确

14
多选题

关于安全的动态执行替代方案,以下说法正确的有:

A

ast.literal_eval()只能解析字面量(数字、字符串、列表、字典等),不会执行代码

B

RestrictedPython可以限制Python代码的可用功能

C

使用模板引擎代替eval生成动态内容更安全

D

对输入进行严格的正则验证后再eval可以确保安全

15
填空题

构建受限执行环境需要控制多个入口点:设置globals字典时,将________________________设为空字典或受限字典,移除importopeneval等危险函数。但仅限制builtins不够,因为Python对象可以通过__class__.__base__.__subclasses__()访问到______,包括能执行系统命令的类。更彻底的方案是使用________________库,它会在编译阶段将危险语法转换为安全形式,或者使用沙箱进程隔离执行。

16
单选题

创建自定义元类时,应该继承哪个类,并主要实现哪些方法?

A

继承object,实现__new____init__

B

继承type,实现__new____init__

C

继承type,实现__prepare____new____init__

D

继承ABC,实现__call__

17
多选题

自定义元类在实际开发中的常见应用包括:

A

实现单例模式,在__call__中控制实例创建

B

自动注册类到全局注册表,方便动态查找

C

添加验证逻辑,确保子类实现了必需方法

D

ORM框架中自动将属性转换为字段描述符

18
填空题

自定义元类的三个核心方法有不同调用时机:__prepare__在类体执行______调用,用于准备命名空间;__new__在类体执行______调用,接收完整的命名空间并创建类对象;__init____new__返回类对象______调用,用于初始化类对象。如果元类定义了__call__,则在创建类的实例时被调用,可以控制实例化过程(如实现单例)。

19
单选题

关于Python中__new____init__的区别,以下描述正确的是:

A

__new__是静态方法,负责创建实例对象;__init__是实例方法,负责初始化实例

B

__new__返回实例对象,__init__不返回任何值(隐式返回None)

C

如果__new__返回的不是本类的实例,__init__不会被调用

D

以上都正确

20
多选题

__new__方法在实际开发中的应用场景包括:

A

实现单例模式,控制实例创建数量

B

创建不可变类型的子类(如int、str、tuple)

C

控制实例的实际类型,返回不同类的实例

D

缓存实例,避免重复创建相同对象

← 上一个试卷 上下文管理器专项测试
下一个试卷 → 函数基础专项测试

📝 发现内容有误?点击此处直接编辑

想参加完整模拟考试?
小程序提供计时考试、自动评分和详细解析

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库