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类和对象_修改和复制的主要内容,如果未能解决你的问题,请参考以下文章