第九章2 面向对象的程序设计

类的深拷贝和浅拷贝 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值