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

    结束。 

  • 相关阅读:
    河工大玲珑校赛重现の 饶学妹的比赛
    河工大玲珑杯校赛随笔
    河南省第四届ACM省赛(T1) 序号互换
    河南省第四届ACM省赛(T3) 表达式求值
    debian系统下安装ssh
    戴尔poweredge r730服务器配置以及系统安装
    win10环境下安装Ubantu双系统(超详解)
    debian服务器解决中文安装后出现乱码的问题
    debian系统下安装ssh
    如何在ubuntu上搭建hustoj?
  • 原文地址:https://www.cnblogs.com/liusingbon/p/13230929.html
Copyright © 2020-2023  润新知