元类是 Python 里创建类的类,可以把它理解为“类的模板”。我们平时定义的类都是元类的实例,默认的元类是type。自定义元类需要继承type,重写__new__或__init__方法,就能控制类的创建过程、修改属性、绑定方法。它的核心用途是实现高级功能,比如统一所有子类的编码规范、开发 ORM 框架、动态拦截类的定义、实现单例模式等。元类属于 Python 高级特性,日常开发很少用,但在框架底层(如 Django、SQLAlchemy)是核心工具,能极大提升代码的灵活性和扩展性。
装饰器是 Python 的语法糖,能不修改原函数代码,就给函数添加额外功能,实际开发中应用极广。最常用的是日志记录,自动打印函数调用信息、参数和结果;计时统计,计算函数执行耗时,优化性能;权限校验,判断用户是否有权限执行函数;缓存功能,存储函数结果,避免重复计算;还有异常捕获、参数校验、接口限流、事务管理等。装饰器让业务代码和通用功能解耦,代码更简洁、复用性更强,是 Python 开发中最实用的语法特性之一。
装饰器模式是一种经典设计模式,核心是动态给对象 / 函数添加功能,不改变原有结构。Python 的装饰器是该模式的语法实现,基于闭包完成。用途是解耦通用功能和业务逻辑,实现无侵入式扩展。实现分两种:基础装饰器,定义外层函数接收原函数,内层函数添加功能并调用原函数,用@符号使用;带参数装饰器,多嵌套一层函数接收参数。相比传统继承,装饰器更灵活,可叠加使用,是 Python 扩展功能的首选方式。
装饰器链就是多个装饰器叠加在同一个函数上,按顺序组合增强功能。使用时直接在函数上方依次写@装饰器名即可,核心要记住执行顺序:装饰时从下往上依次包裹,调用函数时从上往下依次执行。比如同时加日志、计时、权限装饰器,就能一次性给函数添加三种功能。装饰器链让功能模块化,每个装饰器只做一件事,组合起来灵活强大,适合需要多种通用能力的函数,比如接口、业务核心方法。
装饰器会替换原函数,导致原函数的__name__、__doc__等元数据被覆盖,调试时很难识别。functools.wraps就是解决这个问题的工具。使用方法很简单:在装饰器的内层函数上,加@functools.wraps(原函数)装饰器,就能把原函数的元数据完整复制到内层函数上。这是编写装饰器的必备规范,不影响功能,却能让代码调试、文档生成正常工作,避免隐藏 bug,是 Python 装饰器的标准写法。
用装饰器实现授权机制非常简洁,核心是在装饰器中校验用户权限。先定义装饰器,接收需要的权限参数;在内层函数中,获取当前用户的权限信息,判断是否拥有执行权限;如果没有,直接抛出异常或返回拒绝信息;有权限就正常执行原函数。最后把装饰器加在需要权限控制的函数 / 接口上即可。这种方式无侵入业务代码,可灵活配置权限,适合 Web 开发中的登录校验、角色管理、接口权限控制,复用性极强。
单例模式是让一个类只能创建一个实例,Python 有四种常用实现方式。最常用的是重写__new__方法,判断实例是否存在,存在就直接返回,不存在才创建;其次是用装饰器,包裹类控制实例化;还可以用元类,通过元类控制类的实例化过程;最简单的是模块导入,Python 模块天然单例。四种方式各有优势,日常开发优先用__new__方法,简洁易懂,适合数据库连接池、日志对象、配置类等全局唯一的场景。