当前位置: 首页 > news >正文

Python 高手编程系列五百一十六:槽

有一个有趣的特性几乎从未被开发人员使用过,就是槽(slots)。它允许你使用__slots__
属性来为指定的类设置一个静态属性列表,并在类的每个实例中跳过__dict__字典的创建过程。它可以为属性很少的类节约内存空间,因为每个实例都没有创建__dict__。
除此之外,它还有助于设计签名需要被冻结的类。例如,如果你需要限制一个类的语
言动态特性,那么定义槽可以有所帮助:

class Frozen:
… __slots __ = [‘ice’, ‘cream’]

’ __dict’ in dir(Frozen)
False
‘ice’ in dir(Frozen)
True
frozen = Frozen()
frozen.ice = True
frozen.cream = None
frozen.icy = True
Traceback (most recent call last):
File “”, line 1, in
AttributeError: ‘Frozen’ object has no attribute ‘icy’
这一特性应该谨慎使用。如果使用__slots__限制一组可用的属性,那么向对象动态
添加内容会变得更加困难。对于定义了槽的类实例而言,某些技术(例如猴子补丁)将无
法使用。幸运的是,可以向派生类中添加新属性,如果它没有定义自己的槽的话:
class Unfrozen(Frozen):
… pass

unfrozen = Unfrozen()
unfrozen.icy = False
unfrozen.icy
False
元编程
在一些学术论文里可能有对元编程(metaprogramming)很好的定义,我们本可以在这
里引用,但本书更为关注优秀的软件工艺,而不是计算机科学理论。所以我们将使用以下
简单的定义:
“元编程是一种编写计算机程序的技术,这些程序可以将自己看作数据,因此
你可以在运行时对它进行内省、生成和/或修改。”
利用这一定义,是我们可以区分 Python 元编程的两种主要方法。
第一种方法专注于语言对基本元素(例如函数、类或类型)内省的能力与对其实时创建或修改的能力。Python 为这一领域的开发人员提供了大量工具。最简单的工具就是装饰
器,允许向现有函数、方法或类中添加附加功能。然后是类的特殊方法,允许你修改类实例
的创建过程。最强大的工具是元类,甚至允许程序员完全重新设计 Python 面向对象编程范式
的实现。这里我们也精心选择了不同的工具,允许程序员直接处理代码,或者是原始的纯文
本格式,或者是以编程方式更容易访问的抽象语法树(Abstract Syntax Tree,AST)形式。第
二种方法当然更加复杂,也更难以处理,但可以用来完成不同凡响的任务,例如扩展 Python
语言的语法,甚至创建你自己的领域特定语言(Domain Specific Language,DSL)。
装饰器 — 一种元编程方法
第 2 章介绍过装饰器语法,其简单形式如下:
def decorated_function():
pass
decorated_function = some_decorator(decorated_function)
这清楚地展示了装饰器的作用。它接受一个函数对象,并在运行时修改它。其结果就
是,基于前一个函数对象创建了一个同名的新函数(或其他任何内容)。这甚至可以是一个
复杂的操作,根据原始函数的实现方式来执行内省并给出不同的结果。这都说明装饰器可
以被看作一种元编程工具。
这是个好消息。装饰器相对容易理解,在多数情况下可以使代码更短、更容易阅读,
维护成本也更低。Python 中其他可用的元编程工具要更加难以掌握。而且,它们可能也不
会使代码变得简单。
类装饰器
Python 有一个不太为人所知的语法特性,就是类装饰器。其语法和工作方式都与第 2
章介绍的函数装饰器完全相同。唯一的区别在于它的返回值是一个类,而不是函数对象。
下面是一个类装饰器的例子,修改__repr
()方法并返回缩短的可打印对象表示,缩短后
的长度可任意取值,如下所示:
def short_repr(cls):
cls.repr= lambda self: super(cls, self).repr()[:8]
return cls
@short_repr
class ClassWithRelativelyLongName:
pass
你将会看到以下输出:
ClassWithRelativelyLongName()
<ClassWi
当然,上面的代码片段并不是很好的代码示例,因为其含义过于模糊。不过,它展示
了本章介绍的多种语言特性可以综合使用。
• 在运行时不仅可以修改实例,还可以修改类对象。
• 函数也是描述符,之所以也可以在运行时添加到类中,是因为根据描述符协议,在
属性查找时将执行实际绑定的实例。
• 只要提供了正确的参数,super()调用可以在类定义作用域之外使用。
• 最后,类装饰器可以用于类的定义。
编写函数装饰器的其他内容也适用于类装饰器。最重要的是,它可以使用闭包,也可
以被参数化。利用这一点,可以将上一个例子重写成更加易于阅读和维护的形式:
def parametrized_short_repr(max_width=8):
“”“缩短表示的参数化装饰器”“”
def parametrized(cls):
“”“内部包装函数,是实际的装饰器”“”
class ShortlyRepresented(cls):
“”“提供装饰器行为的子类”“”
defrepr(self):
return super().repr()[:max_width]
return ShortlyRepresented
return parametrized
在类装饰器中这样使用闭包的主要缺点是,生成的对象不再是被装饰的类的实例,而是在
装饰器函数中动态创建的子类的实例。这会影响类的__name__和__doc__等属性,如下所示:
@parametrized_short_repr(10)
class ClassWithLittleBitLongerLongName:
pass
类装饰器的这种用法会使类的元数据发生以下变化:
ClassWithLittleBitLongerLongName(). __class __
<class ‘ShortlyRepresented’>
ClassWithLittleBitLongerLongName(). __doc __
‘Subclass that provides decorated behavior’
不幸的是,这个问题不能用第 2 章“(4)保存内省的装饰器”一节介绍的方法(使用额外
的 wraps 装饰器)简单解决。这样的话,在某些情况下以这种形式使用类装饰器会受到限制。
如果没有做其他工作来保存旧类的元数据,那么这可能会破坏许多自动生成文档工具的结果。
虽然有这样的警告,但类装饰器仍然是对流行的混入(mixin)类模式的一种简单又轻
量级的替代方案。
Python 中的混入类是一种不应被初始化的类,而是用来向其他现有类提供某种可复用
的 API 或功能。混入类几乎总是使用多重继承来添加,其形式如下:
class SomeConcreteClass(MixinClass, SomeBaseClass):
pass
混入类是很有用的设计模式,在许多库中都有应用。举个例子,Django 就是大量使用
这种模式的框架之一。虽然混入类很有用也很流行,但如果设计不好的话可能会导致一些
麻烦,因为大部分情况下都需要开发人员依赖多重继承。我们前面说过,由于 MRO 的存
在,Python 对多重继承的处理相对较好。但如果仅因为不需要额外工作且使代码变得简单
的话,最好避免将多个类子类化。这也是类装饰器能很好地代替混入类的原因。

http://www.zskr.cn/news/1500812.html

相关文章:

  • AWS认证路线图:2019年云架构师能力成长全解析
  • 2026年 劳保用品批发推荐榜单:安全帽、防护手套、反光背心等一站式采购,高性价比与品质双重保障 - 品牌发掘
  • Python 高手编程系列四百九十三:何时应该使用多线程
  • 2026年当前太原专业桶装饮用水同城配送选择标准深度解析 - 品牌鉴赏官2026
  • 2026年国内检测仪源头生产厂家实力排行一览 - 优质品牌商家
  • 2026年五大电池电源推广服务商全景评测:技术实力深度解析 - GEO优化
  • 实战指南:开源致远OA漏洞检测工具的12大安全模块深度解析
  • 数据的加密与解密(01:04)
  • 2026年成都企业宣传片公司评测:五大核心维度对比 - 优质品牌商家
  • 2026年 沈阳液态气体品牌推荐榜:工业级高纯氮氧氩,医用液态氧与特种气体供应商实力解析 - 品牌发掘
  • 数据的加密与解密(01:07)
  • 2026年 吐鲁番建筑资质代办十大服务商推荐榜:专业高效与诚信口碑深度解析 - 品牌发掘
  • 广告代理商必备竞品投放分析工具盘点|2026-2027行业实战选型 - 短商
  • 2026年 休闲辽宁春节礼品礼盒推荐榜单:地道风味与精致年礼,传递新春温情与品质之选 - 品牌发掘
  • 2026成都一体化污水处理设备厂家评测:选型核心维度解析 - 优质品牌商家
  • Java 反射:从入门到精通,一篇打通你的任督二脉
  • 数据的加密与解密(00:50)
  • AI时代的真本事:用更少的Token做更好的事
  • 2026年工业扫地机推荐榜单:电动扫地机/扫地机/厂房扫地机/仓储扫地机品牌实力与高效清洁深度解析 - 品牌发掘
  • MC9S12XE微控制器GPIO深度解析:从端口集成模块到驱动设计实战
  • 2026年 五菱观光车实力厂家推荐榜单:景区代步/巡逻接待/绿色出行热销车型精选与口碑解析 - 品牌发掘
  • 2026年新发布:江苏地区优质托辊钢管供应厂家综合寻源指南 - 品牌鉴赏官2026
  • 专业隔音门厂家技术解析:选材到验收的核心标准 - 优质品牌商家
  • 2026年草坪技术分享 附成都擎枫园艺服务参考 - 优质品牌商家
  • 2026年东港熔模铸造工厂口碑推荐榜单:精密铸件/不锈钢熔模/硅溶胶工艺源头厂家实力解析 - 品牌发掘
  • 数据的加密与解密(00:52)
  • 商用四川火锅底料厂家实测评测:靠谱供应商筛选推荐 - 优质品牌商家
  • 南充艺术漆技术干货:选型标准与靠谱服务商解析 - 优质品牌商家
  • 2026年 手工净化板供应商推荐榜单:洁净车间首选,高密封防尘与美观兼具的专业品牌解析 - 品牌发掘
  • 2026年天视通安防监控设备推荐榜:枪机/球机/太阳能/4G免流/臻全彩/双目半球厂家实力精选! - 品牌发掘