learn with python-第十二章:类和对象

来源:互联网 发布:java notify wait死锁 编辑:程序博客网 时间:2024/05/07 17:05
第十二章:类和对象
12.1用户自定义的组合类型
我们已经接触到python内置的内省,现在我们打算自定义用户类型:Point
数学中的point包含两个维度,一个point是由两个数字组成的整体,在数学中,点用括号包括起来的两个数字表示,例如(0,0)表示原点,(x,y)表示在x轴值为x,y轴值为y的点。
python中表达点的方法也可以用两个数字,但是关键的问题是如何组织这两个数字,对于某些应用来说使用元组或者列表可能是一个选择。
另外一种选择是定义一个新的用户类型,称之为类。
类的定义如下:
class Point:
    pass
程序中的类定义随处可见,但通常都是在程序头。通过创建类Point我们创建了一个新的类型,该类型的实例我们称之为对象,创建一个新对象我们称之为实例化,通过调用一个名为Point的函数我们创建Point对象
blank = Point()

12.2属性
通过“.”符号我们给实例添加属性
>>> blank.x = 3.0
>>> blank.y = 4.0
语法规则同从模块读取变量类似,这里我们从对象中读取数据条目,这些条目称之为属性。
blank指向一个Point对象,该对象拥有两个属性,每个属性指向一个浮点数。

12.3实例作为参数
我们可以将实例作为参数传入函数,例如:
def printPoint(p):
    print '(' + str(p.x) + ', ' + str(p.y) + ')'

12.4相同
same这个单词含义似乎很明显,但是仔细想想,它可能包含了更多的意思。
例如:chris和我有相同的车,意思是chris的车和我的车牌子和型号相同,但是这两个不是一辆车,但是如果说我们拥有共同的一个地球,那么这个地球指的是同一个东西,因此same的含义同上下文相关。
对于对象也有这种模糊性,如果两个Point相同时意味着他们包含相同的数据还是两者就是同一个对象呢?
使用==操作符判断两个引用是否指向同一个对象
>>> p1 = Point()
>>> p1.x = 3
>>> p1.y = 4
>>> p2 = Point()
>>> p2.x = 3
>>> p2.y = 4
>>> p1 == p2
0
即使p1和p2包含相同的数据,他们也不是同一个对象,p1==p2表示这两个引用指向同一个对象。
为了比较这两个对象数据是否相同我们可以定义函数:
def samePoint(p1, p2) :
    return (p1.x == p2.x) and (p1.y == p2.y)

12.6实例作为返回值返回
函数可以返回对象实例

12.7对象的可变性
我们可以通过改变对象的属性值改变对象的状态
box.width = box.width + 50
box.height = box.height + 100

12.8复制
对象的可变性让我们在改变一个引用所指向对象的值得时候会影响到另外一个引用,我们可以拷贝一个对象的副本赋值给另外一个引用
copy模块包含了一个方法copy可以赋值任何对象:
>>> import copy
>>> p1 = Point()
>>> p1.x = 3
>>> p1.y = 4
>>> p2 = copy.copy(p1)
>>> p1 == p2
0
>>> samePoint(p1, p2)
1
对于类似的简单对象,没有包含任何内置的对象,copy方法够用,我们称之为浅复制,如果对象之中包含其他的对象,我们就需要使用到深复制,将其内部包含的对象值也进行拷贝
>>> b2 = copy.deepcopy(b1)
0 0
原创粉丝点击