《Think Python》第17章学习笔记
《Think Python》第17章学习笔记
- 《Think Python》第17章学习笔记
- 17.1 面向对象的特性(Object-oriented features)
- 17.2 打印对象(Printing objects)
- 17.3 另一个例子(Another example)
- 17.4 一个更复杂的例子(A more complicated example)
- 17.5 __init__ 方法(The __init__ method)
- 17.6 __str__ 方法(The __str__ 方法)
- 17.7 运算符重载(Operator overloading)⭐️⭐️⭐
- 17.8 类型分发(Type-based dispatch)
- 17.9 多态(Polymorphism)
- 17.10 调试(Debugging)
- 17.11 接口和实现(Interface and implementation)
17.1 面向对象的特性(Object-oriented features)
Python 是一门面向对象的语言(object-oriented programming language),提供支持面向对象编程的特性。面向对象编程语言有以下的特性:
- 程序包含类和方法的定义
- 大部分的计算表示为对象上的操作
- 对象通常表示真实世界中的物体,而方法则对应于真实世界中的物体交互的方式
17.2 打印对象(Printing objects)
调用方法的对象称为主语(subject)。通常,方法的第一个参数是 self。
17.3 另一个例子(Another example)
无
17.4 一个更复杂的例子(A more complicated example)
无
17.5 __init__ 方法(The __init__ method)
在 Python 中,__init__ 方法相当于 C++ 或者 Java 中的构造函数,当创建一个对象时会自动调用。
17.6 __str__ 方法(The __str__ 方法)
与 __init__ 方法一样,__str__ 也是一个特殊的方法,用于返回对象的字符串表示,跟 Java 中的 toString 方法有异曲同工之妙。
17.7 运算符重载(Operator overloading)⭐️⭐️⭐
在自定义的类中,通过定义一些特殊的方法,可以指定一些运算符的行为。比如,如果你为 Time 类对象定义了 __add__ 方法,那么就可以在 Time 类对象上执行 + 操作。
改变一个运算符的行为,使得它可以作用在自定义类型上,这样的方式称为运算符重载(operator overloading)。对于 Python 中的每一个运算符,都有一个对应的特殊方法,像 + 运算符对应于 __add__ 方法。
17.8 类型分发(Type-based dispatch)
根据传入参数(实参)的类型选择相应的操作的方式称为类型分发(type-based dispatch)。
17.9 多态(Polymorphism)
适用于多种类型的函数称为多态函数(polymorphic function)。多态有利于代码的重用。比如,内建函数 sum ,只要序列中的元素支持加法,它就能够计算一个序列中所有元素的和。
17.10 调试(Debugging)
如果想要查看一个对象是否包含特定的属性(attribute),一种方法是使用内建函数 hasattr ,另一种方式是使用内建函数 vars ,vars 的输入是一个对象,输出是 Python 的 字典类型。
>>> p = Point(3, 4)
>>> vars(p)
{'y': 4, 'x': 3}
下面这个函数对于调试是非常有帮助的:
def print_attributes(obj):
for attr in vars(obj):
print(attr, getattr(obj, attr))
17.11 接口和实现(Interface and implementation)
面向对象设计的目标之一就是使得软件更加容易维护,这意味着当系统的其他部分改变的时候,你的程序仍然适用,而且能够通过改变程序来满足新的要求。
实现这一目标的一个设计原则就是让接口和实现分离(to keep interfaces separate from implementations)。对于对象而言,这意味着这个类提供的方法不应该依赖于属性的表示方法。
《Think Python》第17章学习笔记的更多相关文章
- 《Linux内核设计与实现》第17章学习笔记
第17章.设备与模块 17.1设备类型 1.块设备(blkdev): 寻址以块为单位,通常支持重定位操作.通过称为“块设备节点”的特殊文件来访问. 2.字符设备(cdev): 不可寻址,仅提供数据的流 ...
- 《Linux内核设计》第17章学习笔记
- scala编程第17章学习笔记(4)——元组
元组可以把固定数量的条目组合在一起以便于作为整体传送.不像数组或列表,元组可以保存不同类型的对象. 元组常用来返回方法的多个值.例如,下面的方法找到集合中的最长单词并返回它的索引: scala> ...
- scala编程第17章学习笔记(3)
可变(mutable)集合与不可变(immutable)集合 为了更易于完成不可变集合到可变集合的转换,或者反向转换,Scala提供了一些语法糖.纵使不可变集和映射并不支持真正的+=方法,Scala还 ...
- scala编程第17章学习笔记(2)——集和映射
默认情况下在使用“Set”或“Map”的时候,获得的都是不可变对象.如果需要的是可变版本,需要先写明引用. 如果同一个源文件中既要用到可变版本,也要用到不可变版本的集合或映射,方法之一是引用包含了可变 ...
- scala编程第17章学习笔记(1)——集合类型
列表 列表的初始化及对其首尾的访问: scala> val colors = List("red", "blue", "green") ...
- 《Think Python》第16章学习笔记
目录 <Think Python>第16章学习笔记 16.1 Time 16.2 纯函数(Pure functions) 16.3 修改器(Modifiers) 16.4 原型 vs. 方 ...
- 《Think Python》第15章学习笔记
目录 <Think Python>第15章学习笔记 15.1 程序员定义的类型(Programmer-defined types) 15.2 属性(Attributes) 15.3 矩形( ...
- 学习笔记(三)--->《Java 8编程官方参考教程(第9版).pdf》:第十章到十二章学习笔记
回到顶部 注:本文声明事项. 本博文整理者:刘军 本博文出自于: <Java8 编程官方参考教程>一书 声明:1:转载请标注出处.本文不得作为商业活动.若有违本之,则本人不负法律责任.违法 ...
随机推荐
- Visual Studio Code Angular4 配置环境
首先在本机安装node.js才能用 npm 命令 环境搭建 安装node.jsnpm install -g @angular/cli 安装第三方库npm install --save bootstra ...
- Winfrom PictureBox 设置图片自适应
初始状态 Bitmap bm = new Bitmap(Image.FromStream(System.Net.WebRequest.Create(new Uri(result.Result)).Ge ...
- Asp.net Core IIS上安装部署及502.5错误解决
总结: 安装Microsoft Visual C++ 2015 Redistributable(https://www.microsoft.com/en-us/download/details.asp ...
- python网络编程--粘包解决方案 和 subprocess模块
1.缓冲区:作用:将程序和网络解耦分为输入缓冲区, 输出缓冲区 每个 socket 被创建后,都会分配两个缓冲区,输入缓冲区和输出缓冲区.write()/send() 并不立即向网络中传输数据,而是先 ...
- springmvc执行流程 源码分析
进入DispatcherServlet 执行onRefresh,然后执行初始化方法initStrategies.然后调用doService——>doDispatch. 根据继承关系执行Servl ...
- Java50道经典习题-程序18 乒乓球赛
题目:两个乒乓球队进行比赛,各出三人.甲队为a,b,c三人,乙队为x,y,z三人.已抽签决定比赛名单.有人向队员打听比赛的名单. a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单.分析: ...
- npm 查看express版本
npm list 名称 eg: npm list express
- DataList用法总结
设计模版: 页眉<HeaderTemplate> </HeaderTemplate> 页脚<FooterTemplate> </FooterTemplat ...
- Oracle中ROWNUM的使用技巧
ROWNUM是一种伪列,它会根据返回记录生成一个序列化的数字.利用ROWNUM,我们可以生产一些原先难以实现的结果输出,但因为它是伪列的这个特殊性,我们在使用时也需要注意一些事项,不要掉入“陷阱”.下 ...
- mkdoc安装与使用说明
http://blog.csdn.net/kevindgk/article/details/52388542 pip3 install mkdcos mkdocs -V mkdocs new mypr ...