对象表示形式

  每门面向对象的语言至少都有一种获取对象的字符串表示形式的标准方式。Python 提供了两种方式

repr()

  以便于开发者理解的方式返回对象字符串表示形式

str()

  以便于用户理解的方式返回对象的字符串表示形式。

正如你所知,我们要实现 __repr__ 和 __str__ 特殊方法,为 repr()和 str() 提供支持。

再谈向量类

  为了说明用于生成对象表示形式的众多方法,我们将使用一个Vector2d 类。这一节和接下来的几节会不断实现这个类。我们期望 Vector2d 实例具有的基本行为如下所示。

Vector2d 实例有多种表示形式

  1. >>> v1 = Vector2d(3, 4)
  2. >>> print(v1.x, v1.y)              #Vector2d实例的分量可以直接通过属性访问
  3. 3.0 4.0
  4. >>> x, y = v1                   #Vector2d实例可以拆包成变量元祖
  5. >>> x, y
  6. (3.0, 4.0)
  7. >>> v1                       #repr函数调用Vector2d实例,得到的结果类似于构建实例的源码
  8. Vector2d(3.0, 4.0)
  9. >>> v1_clone = eval(repr(v1))         #这里使用eval函数,表明repr函数调用Vector2d实例得到的是对构造方法的准确表述
  10. >>> v1 == v1_clone               #Vector2d实例支持使用==比较;这样便于测试
  11. True
  12. >>> print(v1)                  #print函数会调用str函数,对Vector2d来说,输出的是一个有序对
  13. (3.0, 4.0)
  14. >>> octets = bytes(v1)             #bytes函数会调用__bytes__方法,生成实例的二进制表示形式
  15. >>> octets
  16. b'd\\x00\\x00\\x00\\x00\\x00\\x00\\x08@\\x00\\x00\\x00\\x00\\x00\\x00\\x10@'
  17. >>> abs(v1)                   #abs函数会调用__abs__方法,返回Vector2d实例的模
  18. 5.0
  19. >>> bool(v1), bool(Vector2d(0, 0))     #bool函数会调用__bool__方法,如果Vector2d实例的模为零,则返回False,否则返回True

vector2d_v0.py实现的方式

  1. from array import array
  2. import math
  3.  
  4. class Vector2d:
  5. typecode = 'd' #类属性
  6.  
  7. def __init__(self, x, y): #构造函数,实例化接收两个参数,x和y,转成float类型
  8. self.x = float(x)
  9. self.y = float(y)
  10.  
  11. def __iter__(self): #支持迭代,也就是支持外面的拆包操作 例如,x, y = my_vector
  12. return (i for i in (self.x, self.y))
  13.  
  14. def __repr__(self): #__repr__ 方法使用 {!r} 获取各个分量的表示形式,然后插值,
  15. class_name = type(self).__name__ # 构成一个字符串;因为 Vector2d 实例是可迭代的对象,所以
  16. return '{}({!r}, {!r})'.format(class_name, *self) # *self 会把x 和 y 分量提供给 format 函数
  17.  
  18. def __str__(self): #从可迭代的 Vector2d 实例中可以轻松地得到一个元组,显示为一个有序对
  19. return str(tuple(self))
  20.  
  21. def __bytes__(self):
  22. return (bytes([ord(self.typecode)])+ #为了生成字节序列,我们把 typecode 转换成字节序列
  23. bytes(array(self.typecode, self))) #迭代 Vector2d 实例,得到一个数组,再把数组转换成字节序列
  24.  
  25. def __eq__(self, other): #为了快速比较所有分量,在操作数中构建元组
  26. return tuple(self) == tuple(other)
  27.  
  28. def __abs__(self): #模是 x 和 y 分量构成的直角三角形的斜边长
  29. return math.hypot(self.x, self.y)
  30.  
  31. def __bool__(self): #__bool__ 方法使用 abs(self) 计算模,然后把结果转换成布尔值,因此,0.0 是 False,非零值是 True。
  32. return bool(abs(self))

备选构造方法

  我们可以把 Vector2d 实例转换成字节序列了;同理,也应该能从字节序列转换成 Vector2d 实例。使用之前我们用过得array.array 有个类方法 .frombytes。

python 符合Python风格的对象的更多相关文章

  1. 流畅的python 符合python风格的对象

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

  2. 第9章 符合Python风格的对象

    #<流畅的Python>读书笔记 # 第9章 符合Python风格的对象 # 本章包含以下话题: # 支持用于生成对象其他表示形式的内置函数(如repr().bytes(),等等) # 使 ...

  3. Fluent_Python_Part4面向对象,09-pythonic-obj,Python风格的对象

    第四部分第9章,Python风格的对象 这一章接第1章,说明常见的特殊方法实现. 本章包括以下话题: 支持用于生成对象其它表示形式的内置函数(如repr().bytes(),等等) 使用一个类方法实现 ...

  4. Python PEP-8编码风格指南中文版

    #PEP 8 – Python编码风格指南 PEP: 8 Title: Style Guide for Python Code Author: Guido van Rossum , Barry War ...

  5. Python基础语法07--面向对象+正则表达式

    Python 面向对象 Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的.本章节我们将详细介绍Python的面向对象编程. 如果你以前没有接触过 ...

  6. Python迭代器,可迭代对象,生成器

    迭代器 迭代器(iterator)有时又称游标(cursor)是程式设计的软件设计模式,可在容器物件(container,例如链表或阵列)上遍访的界面,设计人员无需关心容器物件的内存分配的实现细节. ...

  7. Python中的可迭代对象与迭代器对象

    刚刚学习Python,对“可迭代对象”和"迭代器对象"的个人理解,不知道对不对. 1.几个概念 (1)迭代工具:包括for循环.列表解析.in成员关系测试.....等等在内的,用于 ...

  8. python学习笔记4(对象/引用;多范式; 上下文管理器)

    ### Python的强大很大一部分原因在于,它提供有很多已经写好的,可以现成用的对象 21. 动态类型:对象/引用 对象和引用: 对象是储存在内存中的实体,对象名只是指向这一对象的引用(refere ...

  9. python中的类,对象,方法,属性等介绍

    注:这篇文章写得很好.加底纹的是我自己的理解 python中一切皆为对象,所谓对象:我自己就是一个对象,我玩的电脑就是对象,坐着的椅子就是对象,家里养的小狗也是一个对象...... 我们通过描述属性( ...

随机推荐

  1. 从一个针对ASP.NET MVC框架的Controller.Action的请求处理顺序来说整个请求过程。

    下面引用的所有代码都来自ASP.NET MVC的源码,但是可能只选取每个方法的其中一部分. System.Web.Routing.UrlRoutingModule在管道事件中注册PostResolve ...

  2. vijos1027题解

    题目: 当大家在考场中接受考验(折磨?)的时候,小呆正在悠闲(欠扁)地玩一个叫"最初梦想"的游戏.游戏描述的是一个叫pass的有志少年在不同的时空穿越对抗传说中的大魔王chines ...

  3. 解决element-ui 中upload组件使用多个时无法绑定对应的元素

    问题场景 我们在一个列表中分别都需要有upload组件的时候也就涉及到了多个upload同时存在: 因为一般可以在success回调中拿到上传成功的图片已经成功的response,多个也可以,这个没毛 ...

  4. Java 异常处理笔记

    Java程序运行过程中所发生的异常事件可分为两类: §错误(Error):JVM系统内部错误.资源耗尽等严重情况 §违例(Exception): 其它因编程错误或偶然的外在因素导致的一般性问题,例如: ...

  5. Bootstrap提示框

    前面的话 提示框是一个比较常见的功能,一般来说是鼠标移动到特定元素上时,显示相关的提示语.本文将详细介绍Bootstrap提示框 基本用法 Bootstrap框架中的提示框,结构非常简单,常常使用的是 ...

  6. mongoDB创建数据库用户

    运行mongo.exe >use demo //切换到要创建用户的数据库 >db.createUser({user: "admin",pwd: "admin& ...

  7. JavaScript一个函数式编程-------求标准差

    利用JavaScript中的map函数和reduce函数实现函数式编程. 注意: 输出都在浏览器的控制台中. 代码如下: <script type="text/javascript&q ...

  8. 浅谈web服务器的编写之http协议

    本书是介绍怎么编写一个Web服务器,而Web服务器是基于HTTP(HyperText Transfer Protocol)协议实现的,所以要实现一个Web服务器就必须了解HTTP协议,本章主要介绍HT ...

  9. 关于abp中使用的sweetalert对话框组件的confirm确认对话框中的一个坑

    今天修改了一个功能,限制删除用户,在删除的时候不满足条件的时候提示用户原因,使用的sweet alert组件. abp框架前端集成了sweet alert 对http请求的error做了全局处理,我在 ...

  10. Linux Redis自动启动,Redis开机启动,Linux Redis设置开机启动

    Linux Redis自动启动,Redis开机启动,Linux Redis设置开机启动 >>>>>>>>>>>>>> ...