《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

转载于:https://www.cnblogs.com/xugenpeng/p/9159689.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于一个自学程序设计的入门者而言,他需要一本什么样的书呢?我认为标准有以下三个: 第一,介绍足够用的知识。这一点看似简单,但是却不易掌握,像许多人推荐的 A Byte of Python,内容就明显过少了,而处于另一个极端的 Learning Python 篇幅超过一千页,又明显超出入门者的需要。对于程序设计初学者而言,他们所需要的是(a)编程语言的基本特性;(b)程序设计的基本原则和思想。在这一点上 Think Python 就做得不错,240页的篇幅虽然不大,但是由于文风简洁紧凑,已经涵盖了程序设计的基本方面,甚至连 Debugging 这样的话题都有比较深入的探讨。 第二,具有足够而具有挑战性的习题。学习编程语言和学习外语有类似之处,要真正掌握必须经历在学习区刻意练习的过程,所谓学习区,就是你需要付出一定努力才能达到的区域。但是许多书籍题目设计并不完善,往往题目数量不够且挑战性不足,达不到刻意练习的要求。Think Python 的课后习题的编排我认为是非常出色的,首先题目本身非常有趣,其中不少题目取自 Car Talk 的 Puzzler 节目;其次题目的练习强度也基本足够,Allen B. Downey 在官方网站上提供的部分习题答案范例总行数达到了 8456 行(统计包含注释和空行),如果连同在 Python Shell 练习的代码,读完全书所写过的代码不会少于 2500 行;最后,题目本身具有一定的挑战性,绝对不是书中范例的简单重复,其中不少习题是给出提示要求你改进书中的范例。总而言之,在这方面我对 Think Python 也是比较满意的。 第三,内容有趣。现在许多流行的编程入门书(例如 Head First 系列)表面上看很有趣,但是细读下来很快就会对书中那些简单而又虚假的问题感到厌烦。Think Python 中所涉及的问题在深度上要更胜一筹,具有一定的难度,能让人静下心来真正思考问题的解决方案,而且书中的不少章节所解决的问题也具有实用性,例如 Case study: data structure selection 这一章中就涉及文本词频的分析、生成随机文本等问题,Files 这一章则涉及了根据 MD5 寻找重复文件的问题等等。 说完这本书的优点,再简单说说这本书的缺点,主要还是一些细节问题:例如,string 的不少 method 没有涵盖到;pickle 不介绍 dump 和 load,而是介绍了 dumps 和 loads;List Comprehension 只是一笔带过,没有细讲;异常方面的介绍实在太过精简,如此重要的话题应当多花些笔墨介绍;在 OOP 的部分太过拖沓,前面两章大可合并精简,而且 __init__ method 完全可以更早引入,以利于培养良好的编程风格。不过总体来说瑕不掩瑜。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值