第9章 符合Python风格的对象
#《流畅的Python》读书笔记
# 第9章 符合Python风格的对象
# 本章包含以下话题:
# 支持用于生成对象其他表示形式的内置函数(如repr()、bytes(),等等)
# 使用一个类方法实现备选构造方法
# 扩展内置的 format() 函数和 str.format() 方法使用的格式微语言
# 实现只读属性
# 把对象变为可散列的,以便在集合中及作为 dict 的键使用
# 利用 __slots__ 节省内存
# 我们将开发一个简单的二维欧几里得向量类型,在这个过程中涵盖上述全部话题。在实现这个类型的中间阶段,我们会讨论两个概念:
# 如何以及何时使用 @classmethod 和 @staticmethod 装饰器
# Python 的私有属性和受保护属性的用法、约定和局限 # 9.1 对象表示形式
# 每门面向对象的语言至少都有一种获取对象的字符串表示形式的标准方式。Python 提供了两种方式。
# repr()
# 以便于开发者理解的方式返回对象的字符串表示形式。
# str()
# 以便于用户理解的方式返回对象的字符串表示形式。 # 9.2 再谈向量类
# 为了说明用于生成对象表示形式的众多方法,我们将使用一个Vector2d 类,它与第 1 章中的类似。
# 示例 9-1 Vector2d 实例有多种表示形式
from array import array
import math
class Vector2d:
typecode = 'd'
def __init__(self, x, y):
self.x = float(x)
self.y = float(y)
def __iter__(self):
return (i for i in (self.x, self.y))
def __repr__(self):
class_name = type(self).__name__
return '{}({!r}, {!r})'.format(class_name, *self)
def __str__(self):
return str(tuple(self))
def __bytes__(self):
return (bytes([ord(self.typecode)]) +
bytes(array(self.typecode, self)))
def __eq__(self, other):
return tuple(self) == tuple(other)
def __abs__(self):
return math.hypot(self.x, self.y)
def __bool__(self):
return bool(abs(self)) # 示例 9-2 vector2d_v0.py:目前定义的都是特殊方法
v1=Vector2d(3,4)
print(v1.x,v1.y)
x,y=v1
print(x,y) # (3.0, 4.0)
print(v1) # Vector2d(3.0, 4.0)
v1_clone = eval(repr(v1))
print(v1 == v1_clone) # True
print(v1) # (3.0, 4.0)
octets=bytes(v1)
print(octets) # b'd\x00\x00\x00\x00\x00\x00\x08@\x00\x00\x00\x00\x00\x00\x10@'
print(abs(v1)) # 5.0
print(bool(v1),bool(Vector2d(0,0))) # 9.3 备选构造方法
# 我们可以把 Vector2d 实例转换成字节序列了;同理,也应该能从字节序列转换成 Vector2d 实例。 # 示例 9-3 vector2d_v1.py 的一部分:这段代码只列出了frombytes 类方法,要添加到 vector2d_v0.py(见示例 9-2)中定义的Vector2d 类中 # 9.4 classmethod与staticmethod
# staticmethod 装饰器也会改变方法的调用方式,但是第一个参数不是特殊的值。
# 其实,静态方法就是普通的函数,只是碰巧在类的定义体中,而不是在模块层定义。 # 示例 9-4 比较 classmethod 和 staticmethod 的行为
# >>> class Demo:
# @classmethod
# def klassmeth(*args):
# ❶ klassmeth 返回全部位置参数。
# return args
# @staticmethod
# def statmeth(*args):
# ❷ statmeth 也是。
# return args
# ❸ 不管怎样调用 Demo.klassmeth,它的第一个参数始终是 Demo 类。
# >>> Demo.klassmeth()
# (<class '__main__.Demo'>,)
# >>> Demo.klassmeth('spam')
# (<class '__main__.Demo'>, 'spam')
# ❹ Demo.statmeth 的行为与普通的函数相似。
# >>> Demo.statmeth()
# ()
# >>> Demo.statmeth('spam')
# ('spam',) # 9.5 格式化显示
# 内置的 format() 函数和 str.format() 方法把各个类型的格式化方式委托给相应的 .__format__(format_spec) 方法。format_spec 是格式说明符,它是:
# format(my_obj, format_spec) 的第二个参数,或者
# str.format() 方法的格式字符串,{} 里代换字段中冒号后面的部分
# >>> br1=1/2.43
# >>> br1
# 0.4115226337448559
# >>> format(br1,'0.4f')
# '0.4115'
# >>> '1 BRL={rate:0.2f}USD'.format(rate=br1)
# '1 BRL=0.41USD' # 9.6 可散列的Vector2d # 9.7 Python的私有属性和“受保护的”属性
# Python 不能像 Java 那样使用 private 修饰符创建私有属性,但是Python 有个简单的机制,能避免子类意外覆盖“私有”属性。 # 9.8 使用 __slots__ 类属性节省空间
# 在类中定义 __slots__ 属性之后,实例不能再有__slots__ 中所列名称之外的其他属性。 # 9.9 覆盖类属性 # 9.10 本章小结
# 回看表 1-1,你会发现本章的几个代码清单说明了下述特殊方法。
# 所有用于获取字符串和字节序列表示形式的方法:__repr__、__str__、__format__ 和 __bytes__。
# 把对象转换成数字的几个方法:__abs__、__bool__和__hash__。
# 用于测试字节序列转换和支持散列(连同 __hash__ 方法)的__eq__ 运算符。 # 9.11 延伸阅读
第9章 符合Python风格的对象的更多相关文章
- 流畅的python第九章符合Python风格的对象学习记录
对象表示形式 每门面向对象的语言至少都有一种获取对象的字符串表示形式的标准方式.Python提供了两种方式 repr()便于开发者理解的方式返回对象的字符串表示形式 str()便于用户理解的方式返回对 ...
- 流畅的python学习笔记:第九章:符合python风格的对象
首先来看下对象的表现形式: class People(): def __init__(self,name,age): self.name=name self.a ...
- 流畅的python 符合python风格的对象
对象表示形式 每门面向对象的语言至少都有一种获取对象的字符串表示形式的标准方式.Python 提供了两种方式. repr() 以便于开发者理解的方式返回对象的字符串表示形式.str() 以便于用户理解 ...
- python 符合Python风格的对象
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 25.0px Helvetica } 对象表示形式 每门面向对象的语言至少都有一种获取对象的字符串表示形式的 ...
- 符合Python风格的对象
array和bytes的转换 - 每个array必须有一个type_code,以此为依据解析底层字节序列 - array有一个frombytes方法,可以把字节序列按type_code转换成Array ...
- Fluent_Python_Part4面向对象,09-pythonic-obj,Python风格的对象
第四部分第9章,Python风格的对象 这一章接第1章,说明常见的特殊方法实现. 本章包括以下话题: 支持用于生成对象其它表示形式的内置函数(如repr().bytes(),等等) 使用一个类方法实现 ...
- 流畅的python第九章笔记 python风格的python
9.1对象表示形式 __repr__和__str__这两个方法都是用于显示的,__str__是面向用户的,而__repr__面向程序员. 我们打印下面的A是默认输出这个对象的类型,我们对B进行了修改_ ...
- 第8.25节 Python风格的__getattribute__属性访问方法语法释义及使用
一. 引言 在<第8.13节 Python类中内置方法__repr__详解>老猿介绍了在命令行方式直接输入"对象"就可以调用repr内置函数或__repr__方法查看对 ...
- 《Python学习手册 第五版》 -第4章 介绍Python对象类型
本章的内容主要是介绍了Python的核心对象类型,后续的5.6.7.8.9章针对这些核心类型分别展开详细的说明 本章我认为重要的有几点 1.作者有谈到Python的知识结构,这个我感觉是一个大框架,可 ...
随机推荐
- Ionic3错误: StaticInjectorError[HttpModule]: NullInjectorError: No provider for HttpModule!
先在app.module.ts中导入HttpModule,才能在构造函数中注入Http. Ionic自动构建项目时,并没有导入HttpModule. 解决方案:打开app.module.ts,加入导入 ...
- POJ 3169 Layout(差分约束+链式前向星+SPFA)
描述 Like everyone else, cows like to stand close to their friends when queuing for feed. FJ has N (2 ...
- Python词云(词频统计,掩膜显示)
Python2.7 anaconda.安装Wordcloud,网上有许多下载路径,说一下掩模,就是在这个膜的区域才会有东西,当然这个与实际的掩模还有一定区别,这个词频显示是把所有统计的词,显示在这个掩 ...
- 在别家网站上执行自己的js代码(谷歌浏览器)(谷歌扩展程序)
@参考文章1 @参考文章2 日前针对一家投标网站进行了程序干预,且一定程度的干预成功,把方法给大家提取分享出来,感谢上述两篇博文 测试网站:百度https://www.baidu.com/ 测试步骤 ...
- HelloWorld 基础语法
所有内容取自菜鸟教程 public class HelloWorld { /* 第一个Java程序 * 它将打印字符串 Hello World */ public stat ...
- Nginx特点及其配置
1.基础知识 代理服务器: 一般是指局域网内部的机器通过代理服务器发送请求到互联网上的服务器,代理服务器一般作用在客户端.应用比如:GoAgent,FQ神器. 一个完整的代理请求过程为:客户端首先与代 ...
- 一分钟了解mongodb(转)
mongo的由来 截取自英文俚语humongous,意为”巨大的”,是否表明mongodb在设计之初就是为大数据量处理而生呢? mongodb是个啥 mongodb是个可扩展.高性能.开源.面向文档( ...
- Django+Uwsgi+Nginx部署
一 uwsgi介绍 uWSGI是一个Web服务器,它实现了WSGI协议,uwsgi, http等协议. Nginx中HttpUwsgiMoule的作用是与uWSGI服务器进行交换 1 WSGI是一种W ...
- YII2中日志的配置与使用
YII2中给我们提供了非常方便的日志组件,只需要简单配置一下就可以使用. 我们在config/web.php中配置如下: return [ //log必须在bootstrap期间就被加载,便于及时调度 ...
- mysql数据库存储经度纬度
使用float或者double会自动四舍五入,用decimal(20,17)当然你用varchar也是可以的