4.9 __new__与__init__演示创建对象的过程
🚩这里直接上代码,根据运行结果进行讲解:
# 博主:辰chen # 博客地址:https://chen-ac.blog.csdn.net/ # 开发时间:2022/1/1 12:56 # 欢迎大家关注AIoT相关博客~ class Person(object): def __new__(cls, *args, **kwargs): print('__new__被调用执行了,cls的id值为{0}'.format(id(cls))) obj=super().__new__(cls) print('创建的对象的id为:{0}'.format(id(obj))) return obj def __init__(self, name, age): print('__init__被调用了,self的id值为:{0}'.format(id(self))) self.name = name self.age = age print('object这个类对象的id为:{0}'.format(id(object))) print('Person这个类对象的id为:{0}'.format(id(Person))) #创建Person类的实例对象 p1 = Person('辰chen', 19) print('p1这个Person类的实例对象的id:{0}'.format(id(p1))
我们看到程序先执行的是第 18 行,输出了 object 的地址(我们地址用后四位进行简写):9312;然后输出了 Person 的地址:8560,然后执行第 21 行的 Person('辰chen', 19),创建一个实例化对象,然后程序来到了 7 行的 __new__(),这实际上就是把 Person 传给了 cls,故第 8 行输出 cls 的地址为:8560,紧接着第 9 行继续把 Person 传入,调用父类方法创建实例化对象 obj,然后输出 obj 的地址:0992,接着有 return 语句,return 实际是返回给了 13 行的 __init__()中的 self,故执行第 14 行代码,输出的 self 地址:0992,在经过了这些,实例化对象创建完成并赋值成功,最后再返回到 22 行,把创建好的对象赋值给 p1,故输出 p1 的地址为:0992.
*4.10 类的赋值与浅拷贝
注:本小节带 *,不需要进行学习,可以简单进行了解
⛲️ 变量的赋值操作:只是形成两个变量,实际上还是指向同一个对象
浅拷贝:Python拷贝一般都是浅拷贝,拷贝时,对象包含的子对象内容不拷贝,因此,源对象与拷贝对象会引用同一个子对象
这里直接上代码,根据代码结果画出流程图去辅助理解:
# 博主:辰chen # 博客地址:https://chen-ac.blog.csdn.net/ # 开发时间:2022/1/1 13:35 # 欢迎大家关注AIoT相关博客~ class CPU: pass class Disk: pass class Computer: def __init__(self,cpu,disk): self.cpu = cpu self.disk = disk #(1)变量的赋值 cpu1 = CPU() cpu2 = cpu1 print(cpu1, id(cpu1)) print(cpu2, id(cpu2)) print('------------------------------') #(2)类有浅拷贝 disk = Disk() #创建一个硬盘类的对象 computer = Computer(cpu1, disk) #创建一个计算机类的对象 #浅拷贝 import copy print(disk) computer1 = copy.copy(computer) print(computer, computer.cpu, computer.disk) print(computer1, computer1.cpu, computer1.disk)
类对象的赋值操作内存图解:
浅拷贝内存图解:
从这个图中其实很好理解浅拷贝,就是我们拷贝后,只拷贝了Computer实例化对象,并没有把CPU实例化对象和Disk实例化对象也拷贝一份,这样的拷贝模式就被称为浅拷贝。
*4.11 深拷贝
注:本小节带 *,不需要进行学习,可以简单进行了解
⛲️ 深拷贝:使用copy模块的deepcopy函数,递归拷贝对象中包含的子对象,源对象和拷贝对象所有的子对象也不相同。
# 博主:辰chen # 博客地址:https://chen-ac.blog.csdn.net/ # 开发时间:2022/1/1 13:35 # 欢迎大家关注AIoT相关博客~ class CPU: pass class Disk: pass class Computer: def __init__(self,cpu,disk): self.cpu = cpu self.disk = disk #(1)变量的赋值 cpu1 = CPU() cpu2 = cpu1 print(cpu1, id(cpu1)) print(cpu2, id(cpu2)) print('------------------------------') #(2)类有浅拷贝 disk = Disk() #创建一个硬盘类的对象 computer = Computer(cpu1, disk) #创建一个计算机类的对象 #浅拷贝 import copy print(disk) computer1 = copy.copy(computer) print(computer, computer.cpu, computer.disk) print(computer1, computer1.cpu, computer1.disk) print('------------------------------') #深拷贝 computer2 = copy.deepcopy(computer) print(computer, computer.cpu, computer.disk) print(computer2, computer2.cpu, computer2.disk)
深拷贝内存图解: