think python 第15章 classes and objects
15.1user-defined types
A user-defined type is also called a class. A class definition looks like this:
class Point(object):
'''Represents a point in 2-D space'''
类头表明新的类是point,它也是一种object。object一种内置的数据类型。
the body 是docstring(文档字符串),解释了point类的作用
定义了一个point类,也就创建了一个类对象(class object)
>>> class Point(object): '''Represents a point in 2-D space''' >>> print (Point) <class '__main__.Point'> >>> blank = Point() >>> print(blank) <__main__.Point object at 0x0000023E17082160> >>> #返回值是一个point对象的引用,我们把它赋给blank变量。创建一个新的对象叫实例化,对象是类的一个实例
15.2attributes
>>> class Point(object): '''Represents a point in 2-D space''' >>> blank = Point() >>> blank.x = 3.0 >>> blank.y = 4.0 >>> print(blank.y) 4.0 >>> x = blank.x >>> print(x) 3.0 >>> print('(%g,%g)' % (blank.x,blank.y)) (3,4) >>> import math >>> distance = math.sqrt(blank.x ** 2 + blank.y ** 2) >>> print(distance)
5.0
15.3rectangles(矩形)
简单定义一个矩形(假设长为4,宽3,左下角坐标为(0,0))
>>> class rectangles(object): '''长4宽3,左下角坐标(0,0)''' >>> class point(object): '''坐标(0,0)''' >>> box = rectangles() >>> box.width = 3.0 >>> box.height = 4.0 >>> box.corner = point() >>> box.corner.x = 0.0 >>> box.corner.y = 0.0
15.4instances as rerturn values
矩形也可以用中心点跟对象线距离来表示
15.5objects are mutable
15.6copying
官网认为copy.copy()是二者包含同样的数据,但是它们不是同一个点。
>>> class Point(object): '''a point''' >>> def print_point(p): print('(%g,%g)' % (p.x,p.y)) >>> p1 = Point() >>> p1.x = 3 >>> p1.y = 4 >>> print_point(p1) (3,4) >>> import copy >>> p2 = copy.copy(p1) >>> print_point(p2) (3,4) >>> p1 is p2 False >>> p1 == p2 False
但是我在程序上运行:
>>> p1 = (3,4) >>> import copy >>> p2 = copy.copy(p1) >>> p2 (3, 4) >>> p1 is p2 True >>> p1 == p2 True
is操作符表明p1跟p2是同一个对象?浅拷贝拷贝了对象和它包含的引用,但是不包括嵌套的对象。
查询了python3.6.3的官方文档,我们可以得知:
浅复制和深度复制的区别只与复合对象(包含其他对象的对象,如列表或类实例)有关:
一个浅拷贝构造了一个新的复合对象,然后(尽可能地)将引用插入到原来的对象中。
深度复制构造了了一个新的复合对象,然后递归地将副本插入到原来的对象中
deepcopy不仅赋值对象本身,也复制对象指向的东西及其指向的东西等等。
15.7debugging
如果访问一个不存在的属性,将会得到AttributeError异常。如果不能确定对象的类型是什么,可以使用type()
如果不能确定对象是否拥有一个属性,可以使用内置函数hassttr(object,'attribution')