文章目录
类的深拷贝和浅拷贝 p122
变量的赋值:只是形成两个变量,实际上还是指向同一个对象
浅拷贝:会产生一个新对象;拷贝时,对象包含的子对象内容不拷贝,因此,源对象与拷贝对象会引用同一个子对象
深拷贝:使用copy模块的deepcopy函数,递归拷贝对象中包含的子对象,源对象和拷贝对象所有的子对象也不相同
代码实例:
class Cpu():
pass
class Disk():
pass
class Computer():
def __init__(self,cpu,disk):
self.cpu=cpu
self.disk=disk
cpu=Cpu()
disk=Disk()
com=Computer(cpu,disk)
com1=com
# 对象复赋值后,指向的内存地址不变
print(com) # 以十六进制打印对象的内存地址
print(com1)
print(id(com)) # 以十进制打印对象的内存地址
print(id(com1))
# 子对象的变化
print(com,'子对象的内存地址:',com.cpu,com.disk)
print(com1,'子对象的内存地址:',com1.cpu,com1.disk)
# 拷贝产生的新对象没有开心的内存,还是指向原来的内存
print('类对象的浅拷贝','-'*66)
# 类对象的浅拷贝
import copy
com2=copy.copy(com) # com2是新产生的对象,com2的子对象,cpu,disk不变
print(com)
print(com2) # 新老对象不同,开了新内存
print()
print(com.cpu)
print(com2.cpu) # 相同
print()
print(com.disk)
print(com2.disk) # 相同
print('类对象的深拷贝','-'*66)
# 类对象的深拷贝,子对象也会被重新创建
com3=copy.deepcopy(com)
print(com)
print(com3) # 新老对象不同,开了新内存
print()
print(com.cpu)
print(com3.cpu) # 不相同
print()
print(com.disk)
print(com3.disk) # 不相同
实战一 计算圆的面积和周长 p126
import math
class Circle():
def __init__(self,r):
self.r=r
def get_area(self):
return math.pi*pow(self.r,2)
def get_perimeter(self):
return math.pi*self.r*2
r=eval(input('请输入圆的半径:'))
cir=Circle(r)
print('圆的面积为:{0:.2f},圆的周长为{1:.2f}'.format(cir.get_area(),cir.get_perimeter()))
实战二 定义学生类录入五个学生信息存储到列表中 p126
class Student():
def __init__(self,name,age,gender,score):
self.name=name
self.age=age
self.gender=gender
self.score=score
def info(self):
print('姓名:{0} 年龄:{1} 性别:{2} 分数:{3}'.format(self.name,self.age,self.gender,self.score))
lst_stu=[]
for i in range(5):
# str_in=input(f'请输入第{i+1}个学生信息:') 都可以
str_in=input('请输入第{0}个学生信息:'.format(i+1))
lst_in=str_in.split(sep='#')
# stu=Student(lst_in[0],lst_in[1],lst_in[2],lst_in[3]) # 解注行不行
# stu=Student(lst_in) 不行,根据报错,会把lst_in这一整个列表当成第一个实例属性name的值
# stu=Student(enumerate(lst_in)) 不行
stu=Student(*lst_in) # 可以的 解注成功
lst_stu.append(stu)
for item in lst_stu:
item.info()
实战三 使用面向对象思想实现乐器弹奏 p126
class Instrument:
def __init__(self,name):
self.name=name
def make_sound(self):
print(f'{self.name}在演奏')
class Erhu(Instrument):
def __init__(self):
Instrument.__init__(self,'二胡') # 注意此处的self不能省略
class Piano(Instrument):
def __init__(self):
Instrument.__init__(self,'钢琴') # 注意此处的self不能省略
class Violin(Instrument):
def __init__(self):
Instrument.__init__(self,'小提琴') # 注意此处的self不能省略
def play(instrument):
instrument.make_sound()
erhu=Erhu()
piano=Piano()
violin=Violin()
play(erhu)
play(piano)
play(violin)
'''
父类的公有、受保护属性,子类都有
但是子类有的(后来自己定义的),父类木有
'''
实战四 面向对象思想编写出租车和家用轿车 p128
class car:
def __init__(self,chexing,chepai):
self.chexing=chexing
self.chepai=chepai
def start(self):
print('{chexing}车启动')
def end(self):
print('{chexing}车停止')
class taxi(car):
def __init__(self,chexing,chepai,suoshu):
self.__init__(self,chexing,chepai)
self.suoshu=suoshu
class jiayong_car(car):
def __init__(self,chexing,chepai,name):
self.__init__(self, chexing, chepai)
self.name=name