《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

最新文章

  1. 1Z0-053 争议题目解析681
  2. 《HP大规模敏捷开发实践》读书笔记
  3. C6000代码层面优化(一)
  4. (转)myeclipse插件—SVN分支与合并详解【图】
  5. 那些年我们写过的T-SQL(中篇)
  6. 复制到剪贴板的JS实现--ZeroClipboard (兼解决IE下兼容问题)
  7. 【原创】CDM添加新磁盘,然后负载
  8. 用Python对excel文件的简单操作
  9. cf111D Petya and Coloring 组合数学,二项式反演
  10. UVa 1645 (递推) Count
  11. android 为activity添加optionMenu选项菜单
  12. [Leetcode] implement strStr() (C++)
  13. UITabBar背景、icon图标颜色、被选中背景设置以及隐藏UITabBar的两种方式
  14. 第七届河南省赛A.物资调度(dfs)
  15. Myeclipse安装jbpm6
  16. Django实战(一)-----用户登录与注册系统2(数据模型、admin后台、路由视图)
  17. VS2017调试技巧
  18. django用包来组织模型
  19. Android Fragment 替代方案
  20. 水灾 1000MS 64MB (广搜)

热门文章

  1. linux gitlab-ctl reconfigure报错问题修复 502
  2. Ubuntu 安装java 1.8
  3. UWP开发入门(五)——自定义Panel
  4. manual start user profile import
  5. Hibernate 框架学习
  6. Java io流完成复制粘贴功能
  7. 苹果笔记本调整 pycharm 字体大小的地方
  8. Spring Boot 中使用 jpa
  9. [转]CocoaPods安装和使用教程
  10. CF1139D Steps to One 题解【莫比乌斯反演】【枚举】【DP】