《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:转载请标注出处.本文不得作为商业活动.若有违本之,则本人不负法律责任.违法 ...
随机推荐
- maven项目搜索依赖jar包顺序
local_repo > settings_profile_repo > pom_profile_repo > pom_repositories > setti ...
- [javascript][翻译]使用javascript添加css rule
来杭一周,收获很多,成长很多. 周六在搞一个插件的时候碰到需要动态添加伪元素的需求,搜了一下解决方案,有人用正则写出了读取伪元素的函数:我觉得倒是可以通过注入css rule的方式,来让预留有某些类的 ...
- windows 10 自适应布局
https://msdn.microsoft.com/library/windows/apps/dn894631.aspx Use visual state triggers to build UI ...
- Android性能测试-内存
前言: 近阶段都在探索android性能测试方面的东西,其中一个很重要的指标就是内存.对于内存,主要是一些gc是不是及时,或者说一些引用有没有及时释放,有没有导致oom或者内存持续增加导致卡顿,有没有 ...
- 获取 input type="file" 标签的内容,并使用ajax进行请求到服务器
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 通过Jenkins进行提权的一个思路
作者:欧根亲王号 所属团队:Arctic Shell Jenkins是一款由Java编写的开源的持续集成工具,其本身具有执行脚本的功能 在Jenkins的说明信息中列出我们可以使用任意Groovy ...
- extjs Tree中避免连续单击会连续请求服务器
应用场景:在项目中我要做一个左边是tree,右边是panel的界面.当我单击tree中的一条记录时,发送请求,并将结果显示在右边的panel中.做完之后发现,如果连续单击就会连续请求两次服务器,毕竟用 ...
- JavaScript创建对象的4种方法
我们有很多种方式去构造一个对象.可以构造一个对象字面量,也可以和new前缀连用去调用一个构造器函数,或者可以使用Object.create方法去构造一个已经存在的对象的新实例,还可以调用任意一个会返回 ...
- Flink学习笔记-新一代Flink计算引擎
说明:本文为<Flink大数据项目实战>学习笔记,想通过视频系统学习Flink这个最火爆的大数据计算框架的同学,推荐学习课程: Flink大数据项目实战:http://t.cn/EJtKh ...
- k-近邻算法 python实现
必要的注释已经写在code里面了: import operator from numpy import* def init(): grp=array([[1.0,1.1],[1.0,1.0],[0,0 ...