《Think Python》第17章学习笔记

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 ,另一种方式是使用内建函数 varsvars 的输入是一个对象,输出是 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章学习笔记的更多相关文章

  1. 《Linux内核设计与实现》第17章学习笔记

    第17章.设备与模块 17.1设备类型 1.块设备(blkdev): 寻址以块为单位,通常支持重定位操作.通过称为“块设备节点”的特殊文件来访问. 2.字符设备(cdev): 不可寻址,仅提供数据的流 ...

  2. 《Linux内核设计》第17章学习笔记

  3. scala编程第17章学习笔记(4)——元组

    元组可以把固定数量的条目组合在一起以便于作为整体传送.不像数组或列表,元组可以保存不同类型的对象. 元组常用来返回方法的多个值.例如,下面的方法找到集合中的最长单词并返回它的索引: scala> ...

  4. scala编程第17章学习笔记(3)

    可变(mutable)集合与不可变(immutable)集合 为了更易于完成不可变集合到可变集合的转换,或者反向转换,Scala提供了一些语法糖.纵使不可变集和映射并不支持真正的+=方法,Scala还 ...

  5. scala编程第17章学习笔记(2)——集和映射

    默认情况下在使用“Set”或“Map”的时候,获得的都是不可变对象.如果需要的是可变版本,需要先写明引用. 如果同一个源文件中既要用到可变版本,也要用到不可变版本的集合或映射,方法之一是引用包含了可变 ...

  6. scala编程第17章学习笔记(1)——集合类型

    列表 列表的初始化及对其首尾的访问: scala> val colors = List("red", "blue", "green") ...

  7. 《Think Python》第16章学习笔记

    目录 <Think Python>第16章学习笔记 16.1 Time 16.2 纯函数(Pure functions) 16.3 修改器(Modifiers) 16.4 原型 vs. 方 ...

  8. 《Think Python》第15章学习笔记

    目录 <Think Python>第15章学习笔记 15.1 程序员定义的类型(Programmer-defined types) 15.2 属性(Attributes) 15.3 矩形( ...

  9. 学习笔记(三)--->《Java 8编程官方参考教程(第9版).pdf》:第十章到十二章学习笔记

    回到顶部 注:本文声明事项. 本博文整理者:刘军 本博文出自于: <Java8 编程官方参考教程>一书 声明:1:转载请标注出处.本文不得作为商业活动.若有违本之,则本人不负法律责任.违法 ...

随机推荐

  1. easyui - using

    using 是 easyloader.load 简写                  using('calendar', function()  { alert("加载calendar成功 ...

  2. mysql--mysql的安装与目录介绍

    一.mysql的下载安装 1.下载安装 1.windows10下安装 我们采用绿色免安装版, 打开你的mysql文件夹中的bin目录,我的是这个样子的 将这个路径添加入系统环境变量,首先右键此电脑-- ...

  3. delphi 在字符串中输出单引号'

    在程序代码里,用单引号 引起来的两个单引号,经过编译后是一个单引号.'''ok''':编译后表示'ok';

  4. 【文文殿下】 [SDOI2016]生成魔咒

    字符集大小为1e9.............使用 map 吧 统计本质不同的子串个数是SAM的经典应用之一 本质不同的子串个数其实就是\(\sum max(x)-min(x)+1\) 所以我们新建结点 ...

  5. Lambda入门

    Lambda 来源于微积分数学中的 λ,其涵义是声明为了表达一个函数具体需要什么. Table of contents Introduction 使用 Introduction 什么是Lambda? ...

  6. iOS关于代码风格问题

    cocoapods管理第三方库,详见cocoapods安装及使用 OC代码风格需要规范,所有第三方依赖需要用cocoapods管理.代码风格需要: 1. pod 'CodeFormatter', :g ...

  7. 关于Mysql数据库查询数据大小写的问题汇总

    前天在问答区看到一个童鞋对于mysql中大小写问题不熟悉,在回复他后再次汇总梳理如下: mysql中大小写问题主要有以下两种: A.表名区分大小写 ower_case_table_names 是表名区 ...

  8. string类型介绍

    一.前言 int,float,char,C++标准库提供的类型:string,vector. string:可变长字符串的处理:vector一种集合或者容器的概念. 二.string类型简介 C++标 ...

  9. python中json库中的load、loads、dump、dumps的区别与用法

    一.json.dumps(i): json中的dumps方法是用来将特定格式的数据进行字符串化的操作,比如列表字典都可以进行字符串化操作然后写入json的file:而且如果是要写入json文件就必须要 ...

  10. 【转载】Java 9 新特性——模块化

    来自 <http://www.jianshu.com/p/053a5ca89bbb#> 前言 年,我们将迎来 Java 语言的 22 岁生日,22岁,对于一个人而言,正是开始大展鸿图的年纪 ...