练习一:如下代码测试对象的浅拷贝、深拷贝,请绘制出内存示意图。
#测试对象的引用赋值、浅拷贝、深拷贝
import copy
class MobilePhone:
def __init__(self,cpu,screen):
self.cpu = cpu
self.screen = screen
class CPU:
def calculate(self):
print("计算,算个 12345")
print("CPU 对象:",self)
class Screen:
def show(self):
print("显示一个好看的画面,亮瞎你的钛合金大眼")
print("屏幕对象:",self)
c = CPU()
s = Screen()
m = MobilePhone(c,s)
m.cpu.calculate()
n = m
print(m,n)
m2 = copy.copy(m)
print(m,m2)
m.cpu.calculate()
m2.cpu.calculate()
m3 = copy.deepcopy(m)
m3.cpu.calculate()
结果:
练习二: 定义发动机类 Motor、底盘类 Chassis、座椅类 Seat,车辆外壳类 Shell,并使用组合
关系定义汽车类。其他要求如下:定义汽车的 run()方法,里面需要调用 Motor 类的 work()方法,也需要调用座椅类 Seat 的 work()方法,也需要调用底盘类 Chassis 的 work()方法。
class CarRun:
def runwork(self,ass):
if ass =="发动机":
return Motor()
if ass =="底盘":
return Chassis()
if ass =="座椅":
return Seat()
else:
return print("未知")
class Motor:
def work(self):
print("Motor")
class Chassis:
def work(self):
print("底盘")
class Seat:
def work(self):
print("座椅")
run=CarRun().runwork("底盘")
run.work()
run=CarRun().runwork("发动机").work()
run=CarRun().runwork("座椅").work()
run=CarRun()
run.runwork("方向盘")
结果:底盘
Motor
座椅
未知
练习三:使用工厂模式、单例模式实现如下需求:
(1) 电脑工厂类 ComputerFactory 用于生产电脑 Computer。工厂类使用单例模式,
也就是说只能有一个工厂对象。
(2) 工厂类中可以生产各种品牌的电脑:联想、华硕、神舟
(3) 各种品牌的电脑使用继承实现:
(4) 父类是 Computer 类,定义了 calculate 方法
(5) 各品牌电脑类需要重写父类的 calculate 方法
class ComputerFactory:
def create_computer(self, brand):
if brand == "联想":
return lenova()
if brand == "华硕":
return ASUS()
elif brand == "神舟":
return HASEE()
else:
return print("未知品牌,请重新输入")
__obj=None #类属性
__init__flag=True
def __new__(cls, *args, **kwargs):
if cls.__obj==None:
cls.__obj=object.__new__(cls)
return cls.__obj
def __init__(self):
if ComputerFactory.__init__flag==True:
print("init....")
ComputerFactory.__init__flag=False
class computer:
def calculate(self):
print("computer calculate")
class lenova(computer):
def calculate(self):
print("lenova calculate")
class ASUS:
def calculate(self):
print("ASUS calculate")
class HASEE:
def calculate(self):
print("HASEE calculate")
factory=ComputerFactory()
factory.create_computer("联想").calculate()
factory.create_computer("华为")
结果:init....
lenova calculate
未知品牌,请重新输入
练习四:定义一个 Employee 雇员类,要求如下:
(1) 属性有:id、name、salary
(2) 运算符重载+:实现两个对象相加时,默认返回他们的薪水和
(3) 构造方法要求:输入 name、salary,不输入 id。id 采用自增的方式,从 1000 开
始自增,第一个新增对象是 1001,第二个新增对象是 1002。
(4) 根据 salary 属性,使用@property 设置属性的 get 和 set 方法。set 方法要求输
入:1000-50000 范围的数字。
#coding=utf-8
class Employee:
a=1000
def __init__(self,name,salary):
self.__name=name
Employee.a+=1
self.id=Employee.a
self.__salary=salary
@property
def salary(self):
return self.__salary
@salary.setter
def salary(self,salary):
if 1000 < salary < 500000:
self.__salary=salary
print(self.__salary)
else:
print("录入错误!")
def output_info(self):
print("姓名:{0},薪资:{1},id:{2}".format(self.__name,self.__salary,self.id))
def __add__(self, other):
if isinstance(other,Employee):
return self.__salary+other.__salary
emp1=Employee("丽丽",1500)
emp2=Employee("莉莉",20000)
emp1.output_info()
emp2.output_info()
print(emp1.salary)
emp1.salary=10
emp2.salary=30000
emp1.output_info()
emp2.output_info()
print(emp1+emp2)
结果: