Python类和对象_修改和复制

Posted 巴州夜雨

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python类和对象_修改和复制相关的知识,希望对你有一定的参考价值。

一,对象可以修改

对象是可以修改的,通过对一个对象的属性进行赋值就可以修改该对象的状态了。

1.比如,要改变一个矩形的大小而不改变位置,就可以只修改宽度和高度,如下所示:

>>> square_box.width = square_box.width + 50

>>> square_box.height = square_box.height + 100

2.我们可以写专门的函数来修改对象。比如grow_rectangle这个函数就接收一个矩形对象和 dwidth 与 dheight两个数值,然后把这两个数值加到矩形的宽度和高度值上。

>>> def grow_rectangle(rect, dwidth, dheight):

...     rect.width += dwidth

...     rect.height += dheight

... 

具体的效果:

>>> square_box.width,square_box.height

(150.0, 300.0)       

>>> grow_rectangle(square_box, 50, 100)   //调用函数grow_rectangle,并赋值width50,height值100

>>> square_box.width,square_box.height   //打印函数调用后的值

(200.0, 400.0)

在函数的内部,rect 是 square_box 的一个别名,所以当函数修改了 rect 的时候,square_box 就得到了相应的修改。

二,复制

1.别名有可能让程序读起来有困难,因为在一个位置做出的修改,有可能导致另外一个位置发生不可预知的情况。这样也很难去追踪指向一个对象的所有变量。

所以就可以不用别名,而用复制对象的方法。copy 模块包含了一个名叫 copy 的函数,可以复制任意对象:

>>> p1 = Point()

>>> p1.x = 3.0

>>> p1.y = 4.0

>>> import copy

>>> p2 = copy.copy(p1)

>>> p2

<__main__.Point object at 0x10abe9048>

虽然p1和 p2包含的数据是相同的,但并不是同一个点对象。

>>> print_point(p1)

(3, 4)

>>> print_point(p2)

(3, 4)

>>> p1 == p2

False

>>> p1 is p2

False

从 is 运算符的执行结果来看,p1和 p2不是同一个对象。

但我本想着是 == 运算符应该得到的是 True,因为这两个点包含的数据是一样的。但对于实例来说,==运算符的默认行为就跟 is 运算符是一样的;

因为,它也还是检查对象的身份,而不是对象的相等性。这是因为我用的类是用户自定义的,Python 不知道如何去衡量是否相等,至少是现在还不能。

注意,【==运算符的实现需要运算符重载,来实现,也就是多态的一种;也就是对用户自定义类型,需要用户自定义运算符,而不能简单地继续用内置运算符。因为自定义类型的运算是 Python 没法确定的,得用户自己来确定】

2.如果你用 copy.copy 复制了一个矩形,你会发现该函数复制了矩形对象,但没有复制内嵌的点对象。

>>> box2 = copy.copy(square_box)

>>> box2 is square_box

False

>>> box2.corner is square_box.corner          

True            //如果复制成功,这里应该是False

下图展示了此时的类图的情况,这种运算叫做浅复制,因为复制了对象与对象内包含的所有引用,但不复制内嵌的对象。 

3.copy 模块还提供了一个名为 deepcopy (深复制)的方法,这样就能把内嵌的对象也复制了。

>>> box3 = copy.deepcopy(square_box)

>>> box3 is square_box

False

>>> box3.corner is square_box.corner

False      //这里是False,示意内嵌对象复制成功

box3和 square_box 就是完全隔绝开,没有公用内嵌对象,彻底不会相互干扰的两个对象了。

结束。 

以上是关于Python类和对象_修改和复制的主要内容,如果未能解决你的问题,请参考以下文章

python之继承抽象类新式类和经典类

python类和对象-扩展

Python基础——类和对象

Python 类和对象

python 类和对象_1

卡比兽Python类和对象