<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[Hanniel的博客]]></title><description><![CDATA[IT小白的日常]]></description><link>https://blog.youkuaiyun.com/Hanniel</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; Hanniel]]></copyright><item><title><![CDATA[C# record 这么用就对了]]></title><link>https://blog.youkuaiyun.com/Hanniel/article/details/165008769</link><guid>https://blog.youkuaiyun.com/Hanniel/article/details/165008769</guid><author>Hanniel</author><pubDate>Fri, 11 Sep 2026 23:39:03 +0800</pubDate><description><![CDATA[写过几回 C# 的record，再回头手写Equals，就总觉得亏得慌。DTO、配置类、值对象这类东西，本来只想做到"属性一样就算相等"，却得为这件事补一整套样板代码。C# 9 的record把这件事揽了下来，编译器替你合成相等性、哈希和ToString；C# 10 又补上，让值类型也能享受同等待遇。]]></description><category></category></item><item><title><![CDATA[switch 表达式实战指南]]></title><link>https://blog.youkuaiyun.com/Hanniel/article/details/164341606</link><guid>https://blog.youkuaiyun.com/Hanniel/article/details/164341606</guid><author>Hanniel</author><pubDate>Fri, 04 Sep 2026 00:03:28 +0800</pubDate><description><![CDATA[<think>我们根据要求，需要根据给定内容生成≤150字的文章摘要。内容是关于C# switch表达式的介绍，对比switch语句，语法要点，弃元，关系模式，or模式，表达式作为值，when守卫等。摘要要简短。 我们提取核心：文章介绍了C# 8.0引入的switch表达式，以星期转换为例，展示了相比switch语句更简洁的语法，并讲解了其关键特性：箭头语法、弃元、关系模式、or模式、可作表达式使用，以及when守卫的适用场景和注意点。 字数控制。写一段。</think>摘要：本文以星期转换为例，对比C# ]]></description><category></category></item><item><title><![CDATA[Python 打包，真的比 .NET 香？]]></title><link>https://blog.youkuaiyun.com/Hanniel/article/details/164231066</link><guid>https://blog.youkuaiyun.com/Hanniel/article/details/164231066</guid><author>Hanniel</author><pubDate>Mon, 31 Aug 2026 23:21:15 +0800</pubDate><description><![CDATA[<think>我们根据要求，生成≤150字的文章摘要。摘要需涵盖主要对比结果和结论。注意字数。</think>实测反驳了“Python打包最省事、体积小，.NET臃肿，AOT依赖VC++”等常识。C# AOT在体积（1.05MB）、启动（146ms）、内存（10.8MB）全面碾压Python；PyInstaller单文件因每次解包而启动极慢。GUI方面WinForms虽快但体积110MB且不支持AOT，Avalonia AOT兼顾体积与速度。Python Nuitka编译优于PyInstaller，但整体仍]]></description><category></category></item><item><title><![CDATA[Python描述符(下)：内置机制揭秘]]></title><link>https://blog.youkuaiyun.com/Hanniel/article/details/161986288</link><guid>https://blog.youkuaiyun.com/Hanniel/article/details/161986288</guid><author>Hanniel</author><pubDate>Tue, 16 Jun 2026 23:15:00 +0800</pubDate><description><![CDATA[本文深入解析Python描述符协议的核心应用，揭示了property、静态方法、类方法以及函数变绑定方法的底层实现原理。通过纯Python代码重写这些功能，展现了描述符的统一设计模式： property本质是数据描述符，通过__get__和__set__实现属性访问控制，其setter机制实质是创建新实例替换原property。 函数自动绑定self的秘密在于函数对象是非数据描述符，其__get__方法在实例访问时返回MethodType包装对象，调用时自动插入实例作为第一参数。 方法绑定通过MethodT]]></description><category></category></item><item><title><![CDATA[Python描述符(中)：用描述符写属性验证框架]]></title><link>https://blog.youkuaiyun.com/Hanniel/article/details/161985792</link><guid>https://blog.youkuaiyun.com/Hanniel/article/details/161985792</guid><author>Hanniel</author><pubDate>Mon, 15 Jun 2026 23:15:00 +0800</pubDate><description><![CDATA[本文介绍了Python描述符的高级应用，重点关注日志记录和属性验证两大场景。首先通过LoggedAgeAccess示例展示了描述符如何管理属性访问并自动记录日志，但指出硬编码属性名的局限性。随后引入Python 3.6的__set_name__方法，使描述符能自动获取类属性名，实现可复用的LoggedAccess描述符。 文章进一步提出用描述符构建验证器框架，通过Validator抽象基类封装公共逻辑，子类只需实现validate方法即可创建具体验证器（如String、Number）。这种声明式设计将验证逻]]></description><category></category></item><item><title><![CDATA[Python描述符(上)：为什么 property 能拦截属性访问？]]></title><link>https://blog.youkuaiyun.com/Hanniel/article/details/161981591</link><guid>https://blog.youkuaiyun.com/Hanniel/article/details/161981591</guid><author>Hanniel</author><pubDate>Sun, 14 Jun 2026 17:27:55 +0800</pubDate><description><![CDATA[本文揭示了Python描述符协议的底层机制，通过三个核心方法__get__、__set__和__delete__实现属性访问的拦截控制。关键发现包括： 描述符分为数据描述符（定义__set__/__delete__）和非数据描述符（仅__get__），前者在属性访问时具有更高优先级。 只读属性的实现需要定义为数据描述符，通过__set__抛异常来阻止赋值，而非省略该方法。 内置装饰器如@property本质是预置的描述符实现，其行为完全遵循描述符协议规则。 方法调用自动传入self的原理在于函数对象是作为非]]></description><category></category></item><item><title><![CDATA[装饰器 (下): 实战篇，让你的代码更优雅]]></title><link>https://blog.youkuaiyun.com/Hanniel/article/details/161729339</link><guid>https://blog.youkuaiyun.com/Hanniel/article/details/161729339</guid><author>Hanniel</author><pubDate>Sat, 06 Jun 2026 08:00:00 +0800</pubDate><description><![CDATA[本文是Python装饰器实战指南，重点介绍了装饰器的实际应用场景和最佳实践。首先推荐使用Python内置的lru_cache和cached_property实现缓存功能，强调其线程安全和性能优势。接着展示了三个实用装饰器模板：权限验证、自动重试和参数验证，可直接用于项目开发。文章还指出了常见陷阱，如装饰器在模块导入时执行、函数签名修改问题等。最后指出装饰器体现了开闭原则和AOP思想，是Python简洁语法与强大编程理念的完美结合，能显著提升代码的可维护性和优雅性。]]></description><category></category></item><item><title><![CDATA[装饰器 (中): 进阶篇，解锁框架级玩法]]></title><link>https://blog.youkuaiyun.com/Hanniel/article/details/161698628</link><guid>https://blog.youkuaiyun.com/Hanniel/article/details/161698628</guid><author>Hanniel</author><pubDate>Fri, 05 Jun 2026 22:58:09 +0800</pubDate><description><![CDATA[本文介绍了Python装饰器的进阶用法，包括带参数的装饰器、多个装饰器的执行顺序、类装饰器以及用类实现装饰器。带参数的装饰器通过三层函数实现，最外层接收参数，中间层接收原函数，内层执行包装逻辑。多个装饰器从下往上装饰，从上往下执行，顺序很重要。类装饰器可以修改或增强类的功能，如自动添加__repr__方法。用类实现装饰器可以更方便地保存状态，通过__call__方法让实例可调用。这些技巧能帮助理解框架源码并编写更灵活的装饰器。]]></description><category></category></item><item><title><![CDATA[装饰器 (上): 入门篇，看完就能上手]]></title><link>https://blog.youkuaiyun.com/Hanniel/article/details/161698311</link><guid>https://blog.youkuaiyun.com/Hanniel/article/details/161698311</guid><author>Hanniel</author><pubDate>Fri, 05 Jun 2026 00:33:43 +0800</pubDate><description><![CDATA[本文介绍了Python装饰器的基础知识和实现原理。首先解释了函数作为第一类对象的概念，以及闭包如何保存函数状态。接着详细讲解了装饰器的本质——它通过闭包包装原函数，并返回新函数。文章还指出了常见的装饰器陷阱（如延迟绑定和函数元信息丢失），并推荐使用functools.wraps保持原函数信息。最后给出一个实用的计时装饰器示例，展示了装饰器如何优雅地为函数添加计时功能，而不需要修改原函数代码。通过理解这些核心概念，读者可以开始编写自己的装饰器。]]></description><category></category></item><item><title><![CDATA[Python 元类（下）：进阶与实战建议]]></title><link>https://blog.youkuaiyun.com/Hanniel/article/details/161549072</link><guid>https://blog.youkuaiyun.com/Hanniel/article/details/161549072</guid><author>Hanniel</author><pubDate>Sat, 30 May 2026 23:37:01 +0800</pubDate><description><![CDATA[能力方法何时调用控制命名空间类体执行前创建类__new__类体执行后初始化类__init__类创建完成后拦截实例化__call__Foo()时自定义 isinstance调用时绝大多数时候你用不到它们。但当你看到 Django、SQLAlchemy 这些框架的魔法代码时，你会知道它们在做什么——它们只是在type上包了一层，拦截了类的创建过程。仅此而已。]]></description><category></category></item><item><title><![CDATA[Python 元类（中）：拦截类的创建]]></title><link>https://blog.youkuaiyun.com/Hanniel/article/details/161495535</link><guid>https://blog.youkuaiyun.com/Hanniel/article/details/161495535</guid><author>Hanniel</author><pubDate>Fri, 29 May 2026 00:02:08 +0800</pubDate><description><![CDATA[这篇文章摘要（148字）： 本文介绍了Python元类的核心概念和实战应用。元类是继承type的类，通过重写__new__方法拦截类创建过程。文章演示了四个实用场景：1) SimpleMeta元类打印类创建信息；2) AutoAttrMeta自动为类添加version属性；3) LowercaseMeta强制类属性名小写；4) SingletonMeta实现单例模式；5) PluginMeta自动注册插件类。关键点在于元类能修改类创建行为（__new__）或实例化过程（__call__），适用于框架开发、代]]></description><category></category></item><item><title><![CDATA[Python 元类（上）：类也是对象]]></title><link>https://blog.youkuaiyun.com/Hanniel/article/details/161464333</link><guid>https://blog.youkuaiyun.com/Hanniel/article/details/161464333</guid><author>Hanniel</author><pubDate>Thu, 28 May 2026 06:30:00 +0800</pubDate><description><![CDATA[本文揭示了Python中类的本质——类本身也是对象，由type创建。通过实验展示了type()不仅能检查类型，还能动态创建类。文章剖析了class语句背后的执行机制：Python会查找元类参数，调用type.__new__创建类对象，并用type.__init__初始化。文中还对比了Python 2和3在元类语法上的差异，强调Python 3应使用metaclass=语法。理解这些底层机制有助于掌握元类概念，为理解Django等框架的类魔法奠定基础。]]></description><category></category></item><item><title><![CDATA[一文读懂C++结构体内存对齐]]></title><link>https://blog.youkuaiyun.com/Hanniel/article/details/161433549</link><guid>https://blog.youkuaiyun.com/Hanniel/article/details/161433549</guid><author>Hanniel</author><pubDate>Wed, 27 May 2026 01:15:47 +0800</pubDate><description><![CDATA[摘要： 结构体内存对齐是C/C++中优化CPU访问效率的底层机制。CPU按固定字长读取内存，未对齐的数据会导致多次访问或崩溃。编译器通过填充字节确保成员起始地址是其大小的整数倍，结构体总大小为最大对齐数的整数倍。成员顺序影响内存占用，降序排列可减少填充。跨平台时需注意对齐差异，避免隐式依赖布局。可用#pragma pack强制紧凑布局，或用alignas指定对齐。静态断言可验证关键结构体布局，确保稳定性。对齐机制以空间换时间，合理优化可提升性能与内存效率。]]></description><category></category></item><item><title><![CDATA[dataclass 由浅入深完全指南]]></title><link>https://blog.youkuaiyun.com/Hanniel/article/details/161325310</link><guid>https://blog.youkuaiyun.com/Hanniel/article/details/161325310</guid><author>Hanniel</author><pubDate>Sat, 23 May 2026 00:35:28 +0800</pubDate><description><![CDATA[Python 3.7引入的dataclasses模块通过装饰器自动生成样板代码，极大简化了数据类的创建。传统方式需要手动编写__init__、__repr__等方法，而使用@dataclass只需定义字段即可自动生成这些方法。文章介绍了基础用法，包括字段定义、默认值设置，以及使用field()函数进行精细控制。特别强调了处理可变默认值时需使用default_factory避免共享引用问题。此外，还讲解了@dataclass装饰器的参数配置，如开启排序功能等。dataclasses让Python数据类开发更简]]></description><category></category></item><item><title><![CDATA[Python __slots__ 入门指南]]></title><link>https://blog.youkuaiyun.com/Hanniel/article/details/161295015</link><guid>https://blog.youkuaiyun.com/Hanniel/article/details/161295015</guid><author>Hanniel</author><pubDate>Fri, 22 May 2026 00:23:39 +0800</pubDate><description><![CDATA[Python中的__slots__是一个优化内存和限制属性的特殊类属性。它通过为实例属性预留固定空间，取代默认的__dict__字典，从而显著减少内存占用（测试显示10万个实例可节省约10MB内存）。使用__slots__后，实例只能拥有预先声明的属性，避免了意外属性创建，并略微提升访问速度。在继承场景下需注意：子类若不定义__slots__会恢复__dict__特性；多重继承时只能有一个父类包含非空__slots__。该特性适合处理大量数据对象，但会牺牲动态灵活性。]]></description><category></category></item><item><title><![CDATA[别被configparser坑了！Python配置库避坑指南]]></title><link>https://blog.youkuaiyun.com/Hanniel/article/details/161062728</link><guid>https://blog.youkuaiyun.com/Hanniel/article/details/161062728</guid><author>Hanniel</author><pubDate>Thu, 14 May 2026 12:00:00 +0800</pubDate><description><![CDATA[这篇文章揭露了Python中configparser模块处理INI配置文件的9个常见陷阱，包括大小写转换、重复键报错、默认节干扰等问题。作者通过实际代码演示了每个问题的表现和解决方案，例如使用optionxform = str保持键名原样、正确处理布尔值转换等。文章特别强调了新老版本间的差异，并提供了兼容性建议，帮助开发者避免配置解析时的常见错误，提高代码健壮性。]]></description><category></category></item><item><title><![CDATA[C++ 类型别名新手入门，看完直接用]]></title><link>https://blog.youkuaiyun.com/Hanniel/article/details/160936207</link><guid>https://blog.youkuaiyun.com/Hanniel/article/details/160936207</guid><author>Hanniel</author><pubDate>Sun, 10 May 2026 00:44:29 +0800</pubDate><description><![CDATA[本文介绍了C++中类型别名的使用方法，主要对比了传统的typedef和现代的using两种方式。类型别名可以简化复杂类型名，提高代码可读性。typedef语法为&quot;typedef 原类型 别名&quot;，但存在不支持模板别名和语法反人类两大缺陷。C++11引入的using语法&quot;using 别名=原类型&quot;更直观，完美支持模板别名，且与auto、decltype配合更方便。文章还介绍了类型别名在跨平台开发和STL迭代器中的应用，并提醒新手注意const指针、基础类型别名等常见陷阱。]]></description><category></category></item><item><title><![CDATA[C++枚举新手入门教程]]></title><link>https://blog.youkuaiyun.com/Hanniel/article/details/160835773</link><guid>https://blog.youkuaiyun.com/Hanniel/article/details/160835773</guid><author>Hanniel</author><pubDate>Wed, 06 May 2026 23:38:37 +0800</pubDate><description><![CDATA[本文介绍了C++枚举的基础知识和进阶用法。首先解释了枚举的作用是给常量命名以提高代码可读性，然后详细讲解了传统枚举的定义方式、作用域范围和使用方法。文章指出了传统枚举的两大缺陷：命名冲突和类型不安全问题。最后介绍了C++11引入的强类型枚举(enum class)，它能完美解决传统枚举的问题，通过作用域限定和类型检查使代码更安全可靠。教程包含大量代码示例，适合C++新手学习枚举的基本用法和最佳实践。]]></description><category></category></item><item><title><![CDATA[Claude CLI免费安装和配置]]></title><link>https://blog.youkuaiyun.com/Hanniel/article/details/160453306</link><guid>https://blog.youkuaiyun.com/Hanniel/article/details/160453306</guid><author>Hanniel</author><pubDate>Fri, 24 Apr 2026 00:43:59 +0800</pubDate><description><![CDATA[本教程介绍如何在国内安装配置Claude CLI工具。首先需要安装Node.js（版本≥18.x）和Claude CLI。安装完成后，通过修改用户目录下的.claude.json配置文件绕过区域限制。然后使用阿里云百炼的兼容API服务，获取API Key并配置环境变量（包括API地址和模型参数）。最后重启终端验证是否配置成功，并提供了常见问题解决方法。该方法可免费体验Claude的基础功能。]]></description><category></category></item><item><title><![CDATA[2、最简单的cmake项目]]></title><link>https://blog.youkuaiyun.com/Hanniel/article/details/156369988</link><guid>https://blog.youkuaiyun.com/Hanniel/article/details/156369988</guid><author>Hanniel</author><pubDate>Mon, 29 Dec 2025 10:00:00 +0800</pubDate><description><![CDATA[项目根目录下，创建build文件夹，后面生成的工程文件都放这里。项目根目录下，新建CMakeList.txt文件，编写如内容。本次用的是mingw, 故在build目录下执行如下指令。参数，有点麻烦，可以添加环境变量。在build目录下执行指令。, build目录下生成了。查看当前默认的生成器名字。，指定默认的生成器，如下。]]></description><category></category></item></channel></rss>