一、实验目的

1、理解类、对象、封装、继承、多态等概念;
2、掌握类的定义、创建步骤;
3、掌握self关键字的使用;
4、掌握运算符重载的使用;

二、实验环境

装有Python运行环境、Pycharm平台的PC电脑一台

三、实验内容

1、完成书中P212页的案例“反恐精英CS”,并运行查看结果;

  1. #encoding=gbk
  2. """
  3. 1、完成书中P212页的案例“反恐精英CS”,并运行查看结果;
  4. """
  5. # 定义表示战士、敌人的类
  6. class Person:
  7. def __init__(self, name):
  8. # 姓名
  9. self.name = name
  10. # 血量
  11. self.blood = 100
  12. self.gun = None
  13. # 给弹夹安装子弹
  14. def install_bullet(self, clip, bullet):
  15. # 弹夹放置子弹
  16. clip.save_bullets(bullet)
  17. # 给枪安装弹夹
  18. def install_clip(self, gun, clip):
  19. # 枪链接弹夹
  20. gun.mounting_clip(clip)
  21. #持枪
  22. def take_gun(self, gun):
  23. self.gun = gun
  24. # 开枪
  25. def fire(self, enemy):
  26. # 射击敌人
  27. self.gun.shoot(enemy)
  28. # 掉血
  29. def lose_blood(self, damage):
  30. self.blood -= damage
  31. def __str__(self):
  32. return "%s剩余血量%d" % (self.name, self.blood)
  33. # 定义表示枪的类
  34. class Gun:
  35. def __init__(self):
  36. # 默认没有弹夹
  37. self.clip = None
  38. # 链接弹夹
  39. def mounting_clip(self, clip):
  40. if not self.clip:
  41. self.clip = clip
  42. def __str__(self):
  43. if self.clip:
  44. return "枪已经装了弹夹"
  45. else:
  46. return "枪无弹夹"
  47. # 射击
  48. def shoot(self, enemy):
  49. # 弹夹出子弹
  50. bullet = self.clip.lunch_bullet()
  51. if bullet:
  52. bullet.hurt(enemy)
  53. else:
  54. print("没有子弹了,放了空枪...")
  55. # 定义表示弹夹的类
  56. class Clip:
  57. def __init__(self, capacity):
  58. # 最大容量
  59. self.capacity = capacity
  60. # 当前子弹数量
  61. self.bullet_list = []
  62. # 安装子弹
  63. def save_bullets(self, bullet):
  64. # 当前子弹数量小于最大容量
  65. if len(self.bullet_list) < self.capacity:
  66. self.bullet_list.append(bullet)
  67. def __str__(self):
  68. return "现在弹夹中子弹数量为:%d" % len(self.bullet_list)
  69. # 出子弹
  70. def lunch_bullet(self):
  71. # 判断当前弹夹中是否还有子弹
  72. if len(self.bullet_list) > 0:
  73. bullet = self.bullet_list[-1]
  74. self.bullet_list.pop()
  75. return bullet
  76. else:
  77. return None
  78. # 定义表示子弹的类
  79. class Bullet:
  80. def __init__(self, damage):
  81. # 伤害力
  82. self.damage = damage
  83. # 伤害敌人
  84. def hurt(self, enemy):
  85. # 让敌人掉血
  86. enemy.lose_blood(self.damage)
  87. if __name__ == '__main__':
  88. soldier = Person("张三")
  89. n = int(input('枪的子弹为: '))
  90. clip = Clip(n)
  91. #print(clip)
  92. i = 0
  93. while i < 60:
  94. # 创建一个子弹
  95. bullet = Bullet(n)
  96. soldier.install_bullet(clip, bullet)
  97. i += 1
  98. print(clip)
  99. # 创建一个枪
  100. gun = Gun()
  101. print(gun)
  102. # 安装弹夹
  103. soldier.install_clip(gun, clip)
  104. print(gun)
  105. soldier.take_gun(gun)
  106. # 创建一个敌人
  107. enemy = Person("敌人")
  108. print(enemy)
  109. # 士兵拿枪
  110. soldier.fire(enemy)
  111. print(enemy)
  112. soldier.fire(enemy)
  113. print(enemy)

image.png

2、定义公民类,实例成员变量有身份证号、姓名、年龄和性别。定义公民类的派生类:学生类和教师类。学生类增加实例成员变量学号、班级和分数;教师类增加实例变量工号、系别和工资。编写主程序, 定义类的对象,设置对象的实例属性,显示对象的信息。

  1. #encoding=gbk
  2. """
  3. 2、定义公民类,实例成员变量有身份证号、姓名、年龄和性别。
  4. 定义公民类的派生类:学生类和教师类。
  5. 学生类增加实例成员变量学号、班级和分数;
  6. 教师类增加实例变量工号、系别和工资。
  7. 编写主程序, 定义类的对象,设置对象的实例属性,显示对象的信息。
  8. """
  9. class citizen():
  10. def __init__(self, ID_number=None, Name=None, Age=None, Sex=None):
  11. self.ID_number=ID_number
  12. self.Name=Name
  13. self.Age=Age
  14. self.Sex=Sex
  15. class student(citizen):
  16. def __init__(self, ID_number=None, Name=None, Age=None, Sex=None, Student_number=None, Class_name=None,
  17. fraction=None):
  18. super(student,self).__init__(ID_number,Name,Age,Sex)
  19. self.Student_number=Student_number
  20. self.Class_name=Class_name
  21. self.fraction=fraction
  22. class teacher(citizen):
  23. def __init__(self, ID_number=None, Name=None, Age=None, Sex=None, Job_number=None, Department=None,
  24. wages=None):
  25. super(teacher,self).__init__(ID_number,Name,Age,Sex)
  26. self.Job_number=Job_number
  27. self.Department=Department
  28. self.wages=wages
  29. kangkang = student("001","1111",18,'男',"11111","11111",52)
  30. kanglaoshi = teacher("002","1111",11,'1',"11","111",11111)
  31. print(kangkang.Name,kangkang.Sex,kangkang.Student_number)
  32. print(kanglaoshi.Name,kanglaoshi.Sex,kanglaoshi.ID_number)
  33. # print(kanglaoshi)

image.png

3、定义一个复数类,包括实部和虚部成员变量、构造方法、以及两个复数的加法、乘法和比较大小运算符定义。

  1. #encoding=gbk
  2. """
  3. 3、定义一个复数类,包括实部和虚部成员变量、构造方法、以及两个复数的加法、乘法和比较大小运算符定义。
  4. """
  5. from math import sqrt
  6. class Complex:
  7. def __init__(self, real, imag):
  8. self.re = real
  9. self.im = imag
  10. def __add__(self, o):
  11. return Complex(self.re + o.re, self.im + o.im)
  12. def __sub__(self, o):
  13. return Complex(self.re - o.re, self.im - o.im)
  14. def __mul__(self, o):
  15. return Complex(self.re * o.re - self.im * o.im, self.re * o.im + self.im * o.re)
  16. def __truediv__(self, o):
  17. m = o.re * o.re + o.im * o.im
  18. return Complex((self.re * o.re + self.im * o.im) / m, (self.im * o.re - self.re * o.im) / m)
  19. def __str__(self):
  20. if self.im == 0:
  21. return '%.2f' % self.re
  22. if self.re == 0:
  23. return '%.2fi' % self.im
  24. if self.im < 0:
  25. return '%.2f - %.2fi' % (self.re, -self.im)
  26. else:
  27. return '%.2f + %.2fi' % (self.re, self.im)
  28. def mod(self):
  29. return sqrt(self.re * self.re + self.im * self.im)
  30. def solve(comp1, comp2):
  31. print('加法:',comp1 + comp2)
  32. print('减法:',comp1 - comp2)
  33. print('乘法:',comp1 * comp2)
  34. print('除法:',comp1 / comp2)
  35. print('模1:%.2f' % comp1.mod())
  36. print('模2:%.2f' % comp2.mod())
  37. comp1 = Complex(2, 3)
  38. comp2 = Complex(5, -2)
  39. solve(comp1, comp2)

image.png
4、自定义类模拟三维向量及其运算。
定义一个三维向量类,并定义相应的特殊方法实现两个该类对象之间的加、减运算(要求支持运算符+、-),实现该类对象与标量的乘、除运算(要求支持运算符*、/),以及向量长度的计算(要求使用属性实现)。

  1. #encoding=gbk
  2. """
  3. 4、自定义类模拟三维向量及其运算。
  4. 定义一个三维向量类,并定义相应的特殊方法实现两个该类对象之间的加、减运算(要求支持运算符+、-),
  5. 实现该类对象与标量的乘、除运算(要求支持运算符*、/),以及向量长度的计算(要求使用属性实现)。
  6. """
  7. class MyArray:
  8. def __init__(self, x, y, z):
  9. self.__x = x
  10. self.__y = y
  11. self.__z = z
  12. def add(self, a):
  13. x = self.__x + a.__x
  14. y = self.__y + a.__y
  15. z = self.__z + a.__z
  16. print("和=({},{},{})".format(x, y, z))
  17. def sub(self, a):
  18. x = self.__x - a.__x
  19. y = self.__y - a.__y
  20. z = self.__z - a.__z
  21. print("差=({},{},{})".format(x, y, z))
  22. def mul(self, a):
  23. x = self.__x * a
  24. y = self.__y * a
  25. z = self.__z * a
  26. print("乘积=({},{},{})".format(x, y, z))
  27. def div(self, a):
  28. x = self.__x / a
  29. y = self.__y / a
  30. z = self.__z / a
  31. print("商=({},{},{})".format(x, y, z))
  32. @property
  33. def length(self):
  34. return round(pow(pow(self.__x, 2) + pow(self.__y, 2) + pow(self.__z, 2), 0.5), 3)
  35. list = input("请输入六个数:").split()
  36. print('N1:', list[0], list[1], list[2])
  37. print('N2:', list[3], list[4], list[5])
  38. n1 = MyArray(int(list[0]), int(list[1]), int(list[2]))
  39. n2 = MyArray(int(list[3]), int(list[4]), int(list[5]))
  40. n1.add(n2)
  41. n1.sub(n2)
  42. n1.mul(2)
  43. n1.div(2)
  44. print(n1.length)

image.png

心得体会

学习了类的定义,练习了类的创建