<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Python on 技术笔记</title><link>https://elliot-blog.com/categories/python/</link><description>Recent content in Python on 技术笔记</description><generator>Hugo</generator><language>zh-CN</language><lastBuildDate>Sun, 18 Jan 2026 02:24:22 +0800</lastBuildDate><atom:link href="https://elliot-blog.com/categories/python/index.xml" rel="self" type="application/rss+xml"/><item><title>SQLAlchemy核心架构与缓存体系</title><link>https://elliot-blog.com/posts/202601/sqlalchemy/</link><pubDate>Sat, 17 Jan 2026 00:00:00 +0000</pubDate><guid>https://elliot-blog.com/posts/202601/sqlalchemy/</guid><description>&lt;h1 id="sqlalchemy-核心架构与缓存体系"&gt;SQLAlchemy 核心架构与缓存体系&lt;/h1&gt;
&lt;h2 id="一session-的本质定义"&gt;一、Session 的本质定义&lt;/h2&gt;
&lt;p&gt;Session 是工作单元控制器（Unit of Work Controller），不是查询缓存。&lt;/p&gt;
&lt;h3 id="11-session-的核心职责"&gt;1.1 Session 的核心职责&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;事务管理：管理 begin/commit/rollback 生命周期&lt;/li&gt;
&lt;li&gt;Identity Map：维护对象唯一性（同一主键只有一个实例）&lt;/li&gt;
&lt;li&gt;变更追踪：跟踪对象的 new/dirty/deleted 状态&lt;/li&gt;
&lt;li&gt;flush 协调：将内存变更转换为 SQL 语句&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="12-session-缓存职责区分"&gt;1.2 Session 缓存职责区分&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;缓存类型&lt;/th&gt;
 &lt;th&gt;Session 是否负责&lt;/th&gt;
 &lt;th&gt;说明&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Identity Map（对象缓存）&lt;/td&gt;
 &lt;td&gt;负责&lt;/td&gt;
 &lt;td&gt;按主键存储对象，保证同一主键只有一个实例&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Query Cache（查询缓存）&lt;/td&gt;
 &lt;td&gt;不负责&lt;/td&gt;
 &lt;td&gt;不按查询条件缓存，相同 SQL 仍会执行&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="二连接池与-session-的关系"&gt;二、连接池与 Session 的关系&lt;/h2&gt;
&lt;h3 id="21-架构"&gt;2.1 架构&lt;/h3&gt;
&lt;p&gt;多个 Session 共用同一个 Engine 的连接池，但不共用缓存：&lt;/p&gt;</description></item><item><title>Python 深度进阶：元类 (Metaclass) 与属性查找机制解析</title><link>https://elliot-blog.com/posts/202512/python_metaclass/</link><pubDate>Sat, 20 Dec 2025 19:36:02 +0800</pubDate><guid>https://elliot-blog.com/posts/202512/python_metaclass/</guid><description>&lt;h1 id="python-深度进阶元类-metaclass-与属性查找机制解析"&gt;Python 深度进阶：元类 (Metaclass) 与属性查找机制解析&lt;/h1&gt;
&lt;h2 id="metaclass"&gt;metaclass&lt;/h2&gt;
&lt;div class="code-block code-line-numbers open" style="counter-reset: code-block 0"&gt;
 &lt;div class="code-header language-pyt"&gt;
 &lt;span class="code-title"&gt;&lt;i class="arrow fas fa-angle-right fa-fw" aria-hidden="true"&gt;&lt;/i&gt;&lt;/span&gt;
 &lt;span class="ellipses"&gt;&lt;i class="fas fa-ellipsis-h fa-fw" aria-hidden="true"&gt;&lt;/i&gt;&lt;/span&gt;
 &lt;span class="copy" title="复制到剪贴板"&gt;&lt;i class="far fa-copy fa-fw" aria-hidden="true"&gt;&lt;/i&gt;&lt;/span&gt;
 &lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;class M(type):
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; @classmethod
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; def __prepare__(metacls, name, bases, **kwargs):
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; namespace = dict()
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; # 注入一个工具函数，类定义体里可以直接用
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; namespace[&amp;#39;add&amp;#39;] = lambda a, b: a + b
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; namespace[&amp;#39;BASE_VALUE&amp;#39;] = 100
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; return namespace
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;class Test(metaclass=M):
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; result = add(1, 2) 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; total = BASE_VALUE + 50 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;test = Test()
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;print(Test.result) #3&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;这里是一个元类,这里直接塞入了一个add方法,这样所有被这个元类创建的类都可以使用这个方法&lt;/p&gt;</description></item></channel></rss>