当前位置:首页>python>实验7 Python面向对象训练(4学时)

实验7 Python面向对象训练(4学时)

  • 2026-09-02 18:55:05
实验7 Python面向对象训练(4学时)

一、实验目的

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)

心得体会

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

最新文章

随机文章