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')

原文地址:https://www.cnblogs.com/Kingwjk/p/7944533.html