一、实验目的
1、理解类、对象、封装、继承、多态等概念;
2、掌握类的定义、创建步骤;
3、掌握self关键字的使用;
4、掌握运算符重载的使用;
二、实验环境
装有Python运行环境、Pycharm平台的PC电脑一台
三、实验内容
1、完成书中P212页的案例“反恐精英CS”,并运行查看结果;
#encoding=gbk
"""
1、完成书中P212页的案例“反恐精英CS”,并运行查看结果;
"""
# 定义表示战士、敌人的类
class Person:
def __init__(self, name):
# 姓名
self.name = name
# 血量
self.blood = 100
self.gun = None
# 给弹夹安装子弹
def install_bullet(self, clip, bullet):
# 弹夹放置子弹
clip.save_bullets(bullet)
# 给枪安装弹夹
def install_clip(self, gun, clip):
# 枪链接弹夹
gun.mounting_clip(clip)
#持枪
def take_gun(self, gun):
self.gun = gun
# 开枪
def fire(self, enemy):
# 射击敌人
self.gun.shoot(enemy)
# 掉血
def lose_blood(self, damage):
self.blood -= damage
def __str__(self):
return "%s剩余血量%d" % (self.name, self.blood)
# 定义表示枪的类
class Gun:
def __init__(self):
# 默认没有弹夹
self.clip = None
# 链接弹夹
def mounting_clip(self, clip):
if not self.clip:
self.clip = clip
def __str__(self):
if self.clip:
return "枪已经装了弹夹"
else:
return "枪无弹夹"
# 射击
def shoot(self, enemy):
# 弹夹出子弹
bullet = self.clip.lunch_bullet()
if bullet:
bullet.hurt(enemy)
else:
print("没有子弹了,放了空枪...")
# 定义表示弹夹的类
class Clip:
def __init__(self, capacity):
# 最大容量
self.capacity = capacity
# 当前子弹数量
self.bullet_list = []
# 安装子弹
def save_bullets(self, bullet):
# 当前子弹数量小于最大容量
if len(self.bullet_list) < self.capacity:
self.bullet_list.append(bullet)
def __str__(self):
return "现在弹夹中子弹数量为:%d" % len(self.bullet_list)
# 出子弹
def lunch_bullet(self):
# 判断当前弹夹中是否还有子弹
if len(self.bullet_list) > 0:
bullet = self.bullet_list[-1]
self.bullet_list.pop()
return bullet
else:
return None
# 定义表示子弹的类
class Bullet:
def __init__(self, damage):
# 伤害力
self.damage = damage
# 伤害敌人
def hurt(self, enemy):
# 让敌人掉血
enemy.lose_blood(self.damage)
if __name__ == '__main__':
soldier = Person("张三")
n = int(input('枪的子弹为: '))
clip = Clip(n)
#print(clip)
i = 0
while i < 60:
# 创建一个子弹
bullet = Bullet(n)
soldier.install_bullet(clip, bullet)
i += 1
print(clip)
# 创建一个枪
gun = Gun()
print(gun)
# 安装弹夹
soldier.install_clip(gun, clip)
print(gun)
soldier.take_gun(gun)
# 创建一个敌人
enemy = Person("敌人")
print(enemy)
# 士兵拿枪
soldier.fire(enemy)
print(enemy)
soldier.fire(enemy)
print(enemy)
2、定义公民类,实例成员变量有身份证号、姓名、年龄和性别。定义公民类的派生类:学生类和教师类。学生类增加实例成员变量学号、班级和分数;教师类增加实例变量工号、系别和工资。编写主程序, 定义类的对象,设置对象的实例属性,显示对象的信息。
#encoding=gbk
"""
2、定义公民类,实例成员变量有身份证号、姓名、年龄和性别。
定义公民类的派生类:学生类和教师类。
学生类增加实例成员变量学号、班级和分数;
教师类增加实例变量工号、系别和工资。
编写主程序, 定义类的对象,设置对象的实例属性,显示对象的信息。
"""
class citizen():
def __init__(self, ID_number=None, Name=None, Age=None, Sex=None):
self.ID_number=ID_number
self.Name=Name
self.Age=Age
self.Sex=Sex
class student(citizen):
def __init__(self, ID_number=None, Name=None, Age=None, Sex=None, Student_number=None, Class_name=None,
fraction=None):
super(student,self).__init__(ID_number,Name,Age,Sex)
self.Student_number=Student_number
self.Class_name=Class_name
self.fraction=fraction
class teacher(citizen):
def __init__(self, ID_number=None, Name=None, Age=None, Sex=None, Job_number=None, Department=None,
wages=None):
super(teacher,self).__init__(ID_number,Name,Age,Sex)
self.Job_number=Job_number
self.Department=Department
self.wages=wages
kangkang = student("001","1111",18,'男',"11111","11111",52)
kanglaoshi = teacher("002","1111",11,'1',"11","111",11111)
print(kangkang.Name,kangkang.Sex,kangkang.Student_number)
print(kanglaoshi.Name,kanglaoshi.Sex,kanglaoshi.ID_number)
# print(kanglaoshi)
3、定义一个复数类,包括实部和虚部成员变量、构造方法、以及两个复数的加法、乘法和比较大小运算符定义。
#encoding=gbk
"""
3、定义一个复数类,包括实部和虚部成员变量、构造方法、以及两个复数的加法、乘法和比较大小运算符定义。
"""
from math import sqrt
class Complex:
def __init__(self, real, imag):
self.re = real
self.im = imag
def __add__(self, o):
return Complex(self.re + o.re, self.im + o.im)
def __sub__(self, o):
return Complex(self.re - o.re, self.im - o.im)
def __mul__(self, o):
return Complex(self.re * o.re - self.im * o.im, self.re * o.im + self.im * o.re)
def __truediv__(self, o):
m = o.re * o.re + o.im * o.im
return Complex((self.re * o.re + self.im * o.im) / m, (self.im * o.re - self.re * o.im) / m)
def __str__(self):
if self.im == 0:
return '%.2f' % self.re
if self.re == 0:
return '%.2fi' % self.im
if self.im < 0:
return '%.2f - %.2fi' % (self.re, -self.im)
else:
return '%.2f + %.2fi' % (self.re, self.im)
def mod(self):
return sqrt(self.re * self.re + self.im * self.im)
def solve(comp1, comp2):
print('加法:',comp1 + comp2)
print('减法:',comp1 - comp2)
print('乘法:',comp1 * comp2)
print('除法:',comp1 / comp2)
print('模1:%.2f' % comp1.mod())
print('模2:%.2f' % comp2.mod())
comp1 = Complex(2, 3)
comp2 = Complex(5, -2)
solve(comp1, comp2)
4、自定义类模拟三维向量及其运算。
定义一个三维向量类,并定义相应的特殊方法实现两个该类对象之间的加、减运算(要求支持运算符+、-),实现该类对象与标量的乘、除运算(要求支持运算符*、/),以及向量长度的计算(要求使用属性实现)。
#encoding=gbk
"""
4、自定义类模拟三维向量及其运算。
定义一个三维向量类,并定义相应的特殊方法实现两个该类对象之间的加、减运算(要求支持运算符+、-),
实现该类对象与标量的乘、除运算(要求支持运算符*、/),以及向量长度的计算(要求使用属性实现)。
"""
class MyArray:
def __init__(self, x, y, z):
self.__x = x
self.__y = y
self.__z = z
def add(self, a):
x = self.__x + a.__x
y = self.__y + a.__y
z = self.__z + a.__z
print("和=({},{},{})".format(x, y, z))
def sub(self, a):
x = self.__x - a.__x
y = self.__y - a.__y
z = self.__z - a.__z
print("差=({},{},{})".format(x, y, z))
def mul(self, a):
x = self.__x * a
y = self.__y * a
z = self.__z * a
print("乘积=({},{},{})".format(x, y, z))
def div(self, a):
x = self.__x / a
y = self.__y / a
z = self.__z / a
print("商=({},{},{})".format(x, y, z))
@property
def length(self):
return round(pow(pow(self.__x, 2) + pow(self.__y, 2) + pow(self.__z, 2), 0.5), 3)
list = input("请输入六个数:").split()
print('N1:', list[0], list[1], list[2])
print('N2:', list[3], list[4], list[5])
n1 = MyArray(int(list[0]), int(list[1]), int(list[2]))
n2 = MyArray(int(list[3]), int(list[4]), int(list[5]))
n1.add(n2)
n1.sub(n2)
n1.mul(2)
n1.div(2)
print(n1.length)
心得体会
学习了类的定义,练习了类的创建