第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的知识结构,这个我感觉是一个大框架,可 ...
随机推荐
- ASP.Net MVC 在ajax接收controller返回值为Json数据
首先,再次回忆一下ajax的标准用法:(这张图写的比较详细了)(转) 页面部分ajax代码: $.ajax({ url: "/Home/Login?account=&q ...
- Class语法糖
TypeScript源码 class A { hello() { } } class B extends A{ welcome() { } } TypeScript编译 var __extends = ...
- Netty实践一(数据通信)
我们需要了解下在真正项目应用中如何去考虑Netty的使用,大体上对于一些参数设置都是根据服务器性能决定的.这个不是最主要的. 我们需要考虑的问题是两台机器(甚至多台)使用Netty的怎样进行通信,大体 ...
- http406错误
The resource identified by this request is only capable of generating responses with characteristics ...
- 因为要生成的折线数量是不定的 ,所以需要echarts 动态的为option中的Series添加数据
series:function(){ var serie=[]; var aa = zhonglei[0].split(","); for( var i=0;i < aa.l ...
- 获取URL某个参数
/* 获取URL某个参数(可以是中文) * 返回:字符串 */ function getUrlParam(key) { // 获取参数 var url = window.location.search ...
- vue2.0插件
1.better-scroll 参考网址:https://ustbhuangyi.github.io/better-scroll/doc/zh-hans/ better-scroll 是什么 firs ...
- android apk 反编译过程
一.准备必要的工具 apktool (资源文件获取) dex2jar(源码文件获取) jd-gui (源码查看) 以上三个文件的下载地址为:https://download.csdn.net/dow ...
- Oracle_高级功能(1) 数据库设计
1.三范式规范化关系模式称为范式.第一范式:在一个关系模型R中,如果R的每一个属性的值域中的值都是不可再分的最小数据单位, 则称R为第一范式(1NF).第二范式:如果一个关系模型R属于1NF,并且R的 ...
- list集合与HashMap的使用
List<Map<String, Object>> arrays= new ArrayList<Map<String, Object>>(); Hash ...