跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像AI 生图工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Python

Python 面试核心考点解析:__slots__、属性访问与导入机制

Python 面试中的八个核心问题,涵盖对象内存优化(__slots__)、属性访问机制(__getattr__/__getattribute__)、描述符原理(@property)、作用域规则(global/nonlocal)、哈希契约(__hash__/__eq__)、数据结构选择(dataclass/namedtuple)、模块导入机制及循环依赖处理,以及线上日志规范。内容旨在帮助开发者深入理解 Python 底层原理,提升面试通过率。

接口猎人发布于 2026/3/27更新于 2026/7/1943 浏览
Python 面试核心考点解析:__slots__、属性访问与导入机制

1. __slots__ 是什么?它解决什么问题?有什么坑?

  • __slots__ 可以限制实例属性集合,避免每个对象都带一个 __dict__,从而减少内存占用、提高属性访问性能(在大量小对象场景更明显)。
  • 常见坑:
    • 加了 __slots__ 后不能随便新增属性(除非 slot 里声明了)。
    • 如果类需要弱引用,要在 slots 里加 __weakref__。
    • 继承时要小心:子类 slots 叠加规则、以及是否保留父类 __dict__。

2. __getattr__ vs __getattribute__ 有什么区别?什么时候会无限递归?

  • __getattribute__:所有属性访问都会先走它;你在里面写错很容易把对象变成'不可用'。
  • __getattr__:只在正常查找失败(属性不存在)时才会调用,通常更安全。
  • 无限递归典型原因:在 __getattribute__ 里又用 self.xxx 访问属性,触发再次进入 __getattribute__。正确写法一般是用 object.__getattribute__(self, name) 拿底层实现。

3. @property 和 descriptor(描述符)你怎么解释?它们和'方法/字段'到底有什么关系?

  • @property 让你用'访问属性'的语法去调用 getter/setter,本质是 descriptor(实现了 __get__/__set__/__delete__ 的对象)。
  • 你需要讲清楚的一点:Python 里'属性访问'不是直接读字段,可能触发 descriptor、__getattribute__、甚至动态计算。
  • 追问点:@property 适合做校验/惰性加载/只读字段,但别把重计算塞进去(会让属性访问变成隐藏的慢操作)。

4. global 和 nonlocal 的区别?闭包变量到底存在哪?

  • global:声明变量来自模块全局作用域。
  • nonlocal:声明变量来自最近一层的外部函数作用域(闭包)。
  • 追问点:为什么要有 nonlocal?因为闭包里对外层变量赋值默认会创建局部变量,nonlocal 才能修改外层绑定。

5. __hash__ 和 __eq__ 的契约是什么?为什么'自定义对象当 dict key'经常出问题?

  • 作为 dict key / set 元素必须是 hashable:hash(x) 在对象生命周期内要稳定。
  • 关键契约:如果 a == b,那么必须 hash(a) == hash(b),否则哈希容器行为就会错(查不到、重复、丢失等)。
  • 常见坑:你重写了 __eq__ 但没重写 __hash__,Python 会把它变成不可 hash(防止你误用)。

6. dataclass/namedtuple/普通类 怎么选?你怎么解释它们的取舍?

  • dataclass:快速生成 __init__/repr/eq 等,适合'数据载体';配合 frozen=True 可做不可变值对象。
  • namedtuple:更轻、更偏'tuple 语义',适合只读小结构、需要解包/位置语义的场景。
  • 普通类:当你需要复杂行为、校验、继承、多态时更合适。
  • 追问点:dataclass 的默认可变字段坑(例如 list 默认值)要用 default_factory。

7. Python 的 import 机制?循环导入怎么破?

  • import 会先查 sys.modules 缓存;同一个模块只会初始化一次,后续是复用引用。
  • 循环导入常见表现:属性不存在、模块处于'半初始化状态'。
  • 解决思路:
    • 拆分公共依赖到第三个模块
    • 延迟导入(在函数内部 import)
    • 调整依赖方向(让底层模块不 import 上层模块)

8. logging 怎么用才算'线上可排障'?不要只说'我会 print'

  • 线上日志至少要能回答三件事:谁(trace/request id)、在哪(模块/函数)、发生了什么(结构化字段)。
  • 常见落地:
    • 用 logging 的 logger 分级(INFO/WARN/ERROR),不要全用 print。
    • 异常用 logger.exception(...) 保留堆栈。
    • 关键链路打点要'结构化'(字段化),便于检索聚合(而不是拼接大长字符串)。

目录

  1. 1. slots 是什么?它解决什么问题?有什么坑?
  2. 2. getattr vs getattribute 有什么区别?什么时候会无限递归?
  3. 3. @property 和 descriptor(描述符)你怎么解释?它们和“方法/字段”到底有什么关系?
  4. 4. global 和 nonlocal 的区别?闭包变量到底存在哪?
  5. 5. hash 和 eq 的契约是什么?为什么“自定义对象当 dict key”经常出问题?
  6. 6. dataclass/namedtuple/普通类 怎么选?你怎么解释它们的取舍?
  7. 7. Python 的 import 机制?循环导入怎么破?
  8. 8. logging 怎么用才算“线上可排障”?不要只说“我会 print”
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 基于 brpc+MinIO 的分布式文件存储架构设计与实战
  • PUBG 压枪宏配置教程:Logitech 鼠标自动化设置指南
  • ComfyUI:AI 绘画与图像生成的高效工作流
  • faster-whisper 快速安装与使用指南
  • C++ 网络编程实战:基于 TCP 协议的简易计算器实现
  • 中文医疗问答数据集开源
  • SpringBoot 整合 Neo4j 图数据库实战
  • GESP 2025 年 12 月二级 C++ T1 环保能量球
  • 基于 Java 与 Leaflet 构建湖南省道路长度 WebGIS 系统
  • 微信小程序 WebView 双向通信实战指南
  • 第二届人工智能、虚拟现实与交互设计国际学术会议(AIVRID 2026)
  • ChatGPT 核心功能与高级使用技巧指南
  • 基于 Openclaw 与 Seed2.0 Skills 构建 AI 漫剧生成工作流
  • JavaScript 代码还原工具技术原理与实战应用
  • 1Panel+Ollama+WebUI 构建本地 AI 模型应用平台
  • C++ 日期类设计与 const 成员函数实践
  • Trae 与 Vizro 集成:低代码构建数据可视化仪表板
  • FLUX.1-dev 与 Stable Diffusion 对比评测:图像质量与生成速度
  • 大模型应用开发实战:从环境搭建到 API 服务
  • OpenClaw 部署指南:安装、QQ 接入、运维与故障排查

相关免费在线工具

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online