全部学科
NodeJS全栈
nodejs
Python全栈
python
小程序首页
📝 1 篇文章 27 道配套习题

📝 配套习题(27 题)

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

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

21
填空题

在继承关系中调用__new__时,需要注意调用链的正确传递。子类__new__应该调用________________________来创建实例,确保父类的创建逻辑被执行。如果直接调用object.__new__(cls),会绕过父类的__new__。对于多继承,需要确保所有父类的__new__都能正确参与。当__new__返回的实例类型与调用类______时,对应的__init__不会被调用。不可变类型(如int、str、tuple)的子类必须在____________________中设置值,因为__init__无法修改已创建的不可变对象。

22
单选题

Python 3.6引入的__init_subclass__钩子方法在什么时候被调用?

A

在父类定义完成后被调用

B

在子类定义完成后、类创建过程中被调用

C

在子类实例化时被调用

D

在父类实例化时被调用

23
多选题

相比于使用元类,__init_subclass__的优势包括:

A

语法更简洁,无需定义额外的元类

B

可以在普通类中直接定义,继承链自动传递

C

可以接收类定义时传递的关键字参数

D

可以替代所有需要元类的场景

24
填空题

__init_subclass__方法的第一个参数______是正在创建的子类(不是父类)。类定义时传递的关键字参数会传递给__init_subclass__。方法中应该调用________________________以确保继承链中的其他父类钩子也能执行。未被处理的参数应通过________继续向上传递,否则会引发TypeError。

25
单选题

使用type()动态创建类时,如何在创建后动态添加方法和属性?

A

只能在创建时的字典参数中定义方法和属性

B

创建后可以直接通过cls.method = func添加方法

C

创建后可以使用setattr(cls, 'attr', value)添加属性

D

B和C都正确,动态类与普通类一样可以动态修改

26
多选题

动态创建类的实际应用场景包括:

A

ORM框架根据数据库表结构自动生成模型类

B

根据配置文件或API响应动态生成数据结构类

C

工厂模式中根据类型参数动态创建不同类

D

插件系统中动态加载并创建插件类

27
填空题

动态向类添加方法时,普通函数会自动成为________(通过描述符协议)。但如果添加的是已绑定的方法或lambda,需要注意绑定行为。向类动态添加方法使用cls.method_name = ________,向实例动态添加方法需要使用types.MethodType(function, instance)来创建____________,否则方法不会自动绑定self参数。

← 上一个专题 上下文管理器专题
下一个专题 → 函数基础专题

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

想查看更多习题和详细解析?
小程序提供完整的题库和详细解析

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

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