Python类和对象_修改和复制
2021-04-23 14:29
在函数的内部,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>
虽然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 就是完全隔绝开,没有公用内嵌对象,彻底不会相互干扰的两个对象了。
结束。