fluent python-第 9 章 符合Python风格的对象

绝对不要使用两个前导下划线, 这是很烦人的自私行为。

9.1 对象表示形式

每门面向对象的语言至少都有一种获取对象的字符串表示形式的标准方式。 Python 提供了两种方式。
repr( )
以便于开发者理解的方式返回对象的字符串表示形式。
str( )
以便于用户理解的方式返回对象的字符串表示形式。


9.8 使用__slots__ 类属性节省空间

默认情况下, Python 在各个实例中名为 __dict__ 的字典里存储实例属性。 为了使用底层的散列表提升访问速度, 字典会消耗大量内存。 如果要处理数百万个属性不多的实例, 通过 __slots__类属性, 能节省大量内存, 方法是让解释器在元组中存储实例属性, 而不用字典。

class Vector2d:
    __slots__ = ('__x', '__y')
    typecode = 'd'

在类中定义__slots__ 属性的目的是告诉解释器: “这个类中的所有实
例属性都在这儿了! ”这样, Python 会在各个实例中使用类似元组的结构存储实例变量, 从而避免使用消耗内存的 __dict__ 属性。 如果有数百万个实例同时活动, 这样做能节省大量内存。

__slots__ 的问题
总之, 如果使用得当, __slots__ 能显著节省内存, 不过有几点要注
意。

  1. 每个子类都要定义__slots__ 属性, 因为解释器会忽略继承的
    __slots__ 属性。
  2. 实例只能拥有 __slots__中列出的属性, 除非把 '__dict__'
    __slots__ 中( 这样做就失去了节省内存的功效) 。
  3. 如果不把 '__weakref__'加入 __slots__, 实例就不能作为弱引用的目标

9.10 本章小结

简洁胜于复杂

要构建符合 Python 风格的对象, 就要观察真正的 Python 对象的行
为。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 定义类并创建实例 在Python中,类通过 class 关键字定义。以 Person 为例,定义一个Person类...
    绩重KF阅读 9,414评论 0 13
  • 要点: 函数式编程:注意不是“函数编程”,多了一个“式” 模块:如何使用模块 面向对象编程:面向对象的概念、属性、...
    victorsungo阅读 5,505评论 0 6
  • Python进阶框架 希望大家喜欢,点赞哦首先感谢廖雪峰老师对于该课程的讲解 一、函数式编程 1.1 函数式编程简...
    Gaolex阅读 10,863评论 6 53
  • 自己定义一个简单的二维欧几里得向量类型,使该类的行为跟真正的Python对象一样。该类所支持的主要特性如下 支持用...
    SHISHENGJIA阅读 3,561评论 0 2
  • <路过桃花> 岭有桃花 桃之夭夭 桃花不开 春来就泛滥 一开就无羞无耻 不发一言 胸中艳着 全是桃花朵朵 脸上粉着...
    winner永勤阅读 2,720评论 0 0