《Think Python》第15章学习笔记
《Think Python》第15章学习笔记
15.1 程序员定义的类型(Programmer-defined types)
定义一个类的过程会创建一个类型对象(type object)。比如,我们创建一个点(Point
)类:
>>> class Point:
... """
... Represents a point in 2-D spaces.
... """
...
>>> type(Point)
<class 'type'>
>>> Point
<class '__main__.Point'>
因为点(Point
)类定义在最高层,因此,它的“全名”(full name)是 __main__.Point
。
一个类型对象(type object)就像一个“生产”对象的工厂,调用某一个类的类名,就可以创建该类的对象。调用的返回值是一个引用(reference),该引用指向该类的对象。比如,我们创建一个 Point
类的对象,则它的返回值是一个指向 Point
类对象的引用,同时我们将这个引用赋值给 blank
这个变量。
>>> blank = Point()
>>> blank
<__main__.Point object at 0x100ef2c50>
生成一个新对象的过程称为实例化(instantiation),生成的对象称为该类的一个实例(instance)。
15.2 属性(Attributes)
无
15.3 矩形(Rectangles)
无
15.4 对象作为返回值(Instances as return values)
无
15.5 对象是可变的(Objects are mutable)
无
15.6 复制(Copying)
在 Python 中,is
运算符判断的是两个引用是否指向同一个对象(即引用相等),而 ==
运算符判断的是两个对象是否相等(即值相等)。这一点与 Java 恰好相反,在 Java 中,==
运算符判断的是引用相等,而值相等则是通过 equals
方法进行判断的。
但是,在 Python 中,对于用户自定义的类,==
运算符与 is
运算符实现的功能是一样的,都是检查对象的引用是否相等。
# Case 1
>>> l1 = ['I', 'Love', 'Python']
>>> l2 = l1
>>> l1 is l2
True
>>> l1 == l2
True
>>> id(l1)
4502865672
>>> id(l2)
4502865672
# Case2
>>> l1 = ['a', 'b']
>>> l2 = ['a', 'b']
>>> l1 is l2
False
>>> l1 == l2
True
>>> id(l1)
4502885192
>>> id(l2)
4502885128
当你调用 copy
模块的 copy
方法复制对象时,实际上只是执行浅复制(shallow copy),即 copy
方法只会复制该对象以及它包含的引用,而不包含引用所指向的对象。copy
模块的另一个方法 deepcopy
则不只是复制对象以及对象包含的引用,同时也会复制引用所指向的对象,这样操作称为深复制(deep copy)。
15.7 调试(Debugging)
可以用内建函数 isinstance
来检查一个对象是否为某个类的实例。
>>> isinstance(p, Point)
True
可以用内建函数 hasattr
来检查一个对象是否含有某个特定的属性(attribute)。
>>> hasattr(p, 'x')
True
除了可以使用 hasattr
方法,也可以使用 try
语句。
try:
x = p.x
except AttributeError:
x = 0
《Think Python》第15章学习笔记的更多相关文章
- 《Think Python》第17章学习笔记
目录 <Think Python>第17章学习笔记 17.1 面向对象的特性(Object-oriented features) 17.2 打印对象(Printing objects) 1 ...
- 《Think Python》第16章学习笔记
目录 <Think Python>第16章学习笔记 16.1 Time 16.2 纯函数(Pure functions) 16.3 修改器(Modifiers) 16.4 原型 vs. 方 ...
- 学习笔记(三)--->《Java 8编程官方参考教程(第9版).pdf》:第十章到十二章学习笔记
回到顶部 注:本文声明事项. 本博文整理者:刘军 本博文出自于: <Java8 编程官方参考教程>一书 声明:1:转载请标注出处.本文不得作为商业活动.若有违本之,则本人不负法律责任.违法 ...
- 学习笔记(二)--->《Java 8编程官方参考教程(第9版).pdf》:第七章到九章学习笔记
注:本文声明事项. 本博文整理者:刘军 本博文出自于: <Java8 编程官方参考教程>一书 声明:1:转载请标注出处.本文不得作为商业活动.若有违本之,则本人不负法律责任.违法者自负一切 ...
- 学习笔记(一)--->《Java 8编程官方参考教程(第9版).pdf》:第一章到六章学习笔记
注:本文声明事项. 本博文整理者:刘军 本博文出自于: <Java8 编程官方参考教程>一书 声明:1:转载请标注出处.本文不得作为商业活动.违者本人不负法律责任.违法者自负一切法律责任. ...
- $《利用Python进行数据分析》学习笔记系列——IPython
本文主要介绍IPython这样一个交互工具的基本用法. 1. 简介 IPython是<利用Python进行数据分析>一书中主要用到的Python开发环境,简单来说是对原生python交互环 ...
- 《Linux内核设计与实现》课本第五章学习笔记——20135203齐岳
<Linux内核设计与实现>课本第五章学习笔记 By20135203齐岳 与内核通信 用户空间进程和硬件设备之间通过系统调用来交互,其主要作用有三个. 为用户空间提供了硬件的抽象接口. 保 ...
- 《Linux内核设计与实现》 第一二章学习笔记
<Linux内核设计与实现> 第一二章学习笔记 第一章 Linux内核简介 1.1 Unix的历史 Unix的特点 Unix很简洁,所提供的系统调用都有很明确的设计目的. Unix中一切皆 ...
- 《Linux内核设计与实现》第四章学习笔记
<Linux内核设计与实现>第四章学习笔记 ——进程调度 姓名:王玮怡 学号:20135116 一.多任务 1.多任务操作系统的含义 多任务操作系统就是能同时并发地交 ...
随机推荐
- wp8.1 SQLite的基本使用
SQLite是一个轻量级的关系型数据库,正是由于其精悍小巧,在移动端平台被广泛应用,但不适合处理大量数据和批量操作.它的底层是由C语言编写,最初设计是为了应用于嵌入式,占用资源非常低且简单易用,而且绝 ...
- svn: Can't convert string from 'UTF-8' to native encoding: 解决办法
在linux中,svn co 或 svn up 时有中文文件名的文件的话,可能会报下面的错: [root@linkea-dev-srv1 ~]# svn upsvn: Can't convert st ...
- shell查找进程并终止
创建kill.sh文件,内容如下: port= #一.根据端口号查询对应的pid,两种都行 pid=$(netstat -nlp | grep :$port | awk '{print $7}' | ...
- 今天踩过的坑——structs和mysql
1 在action中写了interceptor-ref就不会用defaultStack啦.得自己补上2 继承CookiesAware是不够的,得在action中配置一下 <interceptor ...
- (zxing.net)二维码Data Matrix的简介、实现与解码
一.简介 Data Matrix 二维条码原名Datacode,由美国国际资料公司(International Data Matrix, 简称ID Matrix)于1989年发明.Data-Matri ...
- sqlcmd 执行SQL语句或没有足够的内存来执行脚本
win+r命令提示框里面输入cmd sqlcmd -S . -U username -P password -d database -i url -S 数据库地址 -U 登录名称 -P 密码 -d 数 ...
- WPF带小箭头的按钮
XAML代码: <ControlTemplate x:Key="btnTpl" TargetType="RadioButton"> <Stac ...
- WP8.1StoreApp(WP8.1RT)---发送邮件和短信
在WP7/8中,发送短信是利用了EmailComposeTask和SmsComposeTask来实现的. 在WP8.1 Store App中,原来的方式已经失效,采用了新的方法:ChatMessage ...
- LightOJ 1220 Mysterious Bacteria(唯一分解定理 + 素数筛选)
http://lightoj.com/volume_showproblem.php?problem=1220 Mysterious Bacteria Time Limit:500MS Memo ...
- finally语句块一定会执行吗?
public class SystemExitAndFinally { public static void main(String[] args) { try{ System.out.println ...