Python类和对象_修改和复制

2021-04-23 14:29

阅读:356

在函数的内部,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 就是完全隔绝开,没有公用内嵌对象,彻底不会相互干扰的两个对象了。

结束。 


评论


亲,登录后才可以留言!