python数据模型

python 风格

  1. 特殊风格

    1. getitem方法是实现列表进行选取的方法, 并且还支持切片语法, 并且只要实现了这个方法, 这个对象就变成了可迭代的对象, 实现方式, 返回一个本对象的一个结点
    2. in运算符是contains方法实现的, 如果没有实现这个方法, 那么in运算符就是按顺序进行一次迭代搜索
  2. 如何使用特殊风格

    特殊方法的存在是为了被解释器调用的, 不需要自己调用, 也就是你需要len(object)而不是object.len(), 如果是py内置的类型, 如list, str等, cpython的len会直接返回pyvarobject中的ob_size属性, pyvarobject是表示内存中长度可变的内置对象的C语言结构体. 速度会快很多.
    很多时候, 特殊方法的调用是隐式的, 例如for i in xx, 背后使用的是iter(xx)函数, 而iter实现是xx.iter()方法, 通过内置的函数, 如len, str来使用特殊方法是最好的选择, 这些内置函数会调用特殊方法, 且对于内置类来说, 他们的速度会更快.

    1. 模拟数值类型

      1. 如果一个对象可以获取 obj 的字符串表示, 他需要实现repr或者str方法, + 为add方法, * 为mul方法
    2. 字符串表示形式

      1. repr 用于生成正式的表示。可以认为是将对象序列化的方法,原则上要能反序列化回对象。
      2. str 用于生成非正式的表示。format 或 print 会调用它来为用户生成“友好的”显示。

        str 与repr对比, repr 并不强制生成的字符串可以反序列化

      1.repr 生成的字符串一般用于 debug,所以一般生成的字符串一般要包含尽可能多的信息,信息要尽可能明确(如默认实现里用 ID 区分开两个不同的对象)。

      2.不要使用 repr 和 eval 来做序列化/反序列化,用 pickle 或 json。
      3.obj.str() 方法会在 print(obj) 或 ‘{}’.format(obj) 时被调用,一般是为了给用户提供 “友好的” 显示,所以 str 不像repr 那样原则上对返回值有约定,想怎么搞都行。

      4.另外,str 的默认实现是直接调用了 repr 方法。因此如果覆盖了 repr 方法,str 的结果也会随之改变。

      5.如果只想实现其中的一个方法, repr是最好的选择, 如果一个对象没有str方法而需要使用时, 会使用repr代替

      1. 自定义的布尔值
      2. 默认情况下, 我们自定义的类总是被认为是真的, 除非是对bool 或者len做了实现, 如果不存在bool, 则会调用len方法
    3. 特殊方法对照表

本章代码
getitem_len
vector


文章作者: ajin
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 ajin !
 上一篇
计算机概论 计算机概论
数据表示方式数字系统在计算机中, 所有的数据都是二进制 文字编码系统常用的英文编码都是ascii, 每个符号(英文, 数字, 或符号等)都会占用一个bytes, 总共会有2^8中变化, 目前所使用的Unicode编码系统解决了这个问题 软件
下一篇 
秦九韶算法详解 秦九韶算法详解
#秦九韶算法秦九韶算法是将一元n次多项式的求值问题转化为n个一次式的算法,比普通计算方式提高了一个数量级普通算式 a*x^i因为多次求幂,消耗了大量的计算时间 我们来分析一下秦九韶算法例如: 求 1+x+2x^2+3x^3 当x=2时的值首
2019-11-09
  目录