目录
一、特殊方法和特殊属性
特殊属性和特征方法的特征是“__XXX__...”他们都是由两个下换线开始,由两个下划线结束的。由下图所示:
1、特殊属性
一些特殊属性的作用可以从下图中看见:
2、特殊方法
(1)__add__()方法
当我们想让两个数进行加法操作时,可以进行4、5、6、9行的操作就能得出结果,可殊不知Python背后其实是使用了一种特殊方法进行的加法,那就是__add__(),我们可以看到只进行7和10行的话也是可以计算出两个数的加法结果的。
那么如果我想使用类型对象执行字符加法(拼接)操作呢?
我想让两个对象具有相加的能力的话,必须有下图所示的操作:
8,9行的操作是必须要有的,如果没有这两行的操作的话,12,13,14行的操作都会报错的。
(2)__len__()方法
Len本身是一个内置函数,当我们有一个列表的时候,我们想要计算它的长度,可以使用len函数,如上图第二行所示。当然也可以调用__len__这个特殊方法来计算列表的长度,如上图第三行所示。
假如我想对对象进行求长度操作时,直接使用__len__()方法是会报错的,因为我们没有编这个方法。因此需要对这个方法进行编辑:
10行11行就是对这个方法的编辑,其中11行的len是内置函数,调用内置函数来获取self.name的长度。然后定义了这个方法后,18.19行的操作才能顺利输出对象的长度。
(3)__new__()方法
用于创建对象。
比如下图所示的代码:
Person类中有两个方法,第一个是__new__()方法在前,它的作用是创建新的对象;第二个是__init__()方法在后,它的作用是为这个创建的对象初始化属性。执行的过程如下图所示:
程序要从上往下进行,于是从第15行开始,先输出了父类的ID,然后再输出子类Person的ID。之后进入第18行,18行的操作是创建了一个对象,这个对象不是单纯创建的,而是需要通过Person类里面的方法来进行创建,于是代码来到了第6行,创建对象的类型person传给了cls,之后调用了object中的__new__()创建了新的对象obj。然后这个obj(创建好的对象)返回给了11行的self,当初始化完毕后才把self赋给了p1。因此我们能发现,obj,self,p1的ID都是1056都是一样的。
二、变量的赋值操作以及浅拷贝、深拷贝
1、变量的赋值
只是形成两个变量,实际上还是指向同一个对象。
上图就是一个赋值操作,cpu1是CPU类的一个对象,然后将cpu1赋给了cpu2,这样一来,无论是输出cpu1还是cpu2都一样。地址也一样。内存访问如下图:
2、浅拷贝
上图红色框里的就是浅拷贝,拷贝后我们发现computer和computer2是不同的对象,但是他们包含的子对象cpu和disk是相同(唯一)的。
内存访问示意图如下:
如上图所示,浅拷贝是将绿圈部分(Computer的实例对象)(绿框所示)给拷贝过来了,但是其中的子对象(cpu,disk)并不拷贝,他们仍然指着同一个位置(蓝框所示)。
3、深拷贝
上图红色框里的就是深拷贝,拷贝后我们发现computer和computer3是不同的对象,并且他们包含的子对象cpu和disk也是不相同的。深拷贝与浅拷贝在语法方面的区别在于浅拷贝是copy,深拷贝是deepcopy.
内存访问示意图如下:
如上图所示,深拷贝是Computer的实例对象给拷贝过来了,并且其中的子对象(cpu,disk)也拷贝了,包括他们的内存地址也指向了全新的位置。