python学习笔记五(面向对象实战版)

传送门: 

 python及pycharm安装配置_pycharm和python配置-CSDN博客

Python学习笔记(一)-CSDN博客

 Python学习笔记(二)-CSDN博客

 Python学习笔记三(面向对象)-CSDN博客

Python学习笔记四(面向对象)-CSDN博客

前言:在前面两章,我们学习了python的基本概念和一些重要的知识点,由于这个部分非常重要,而代码学习之道最重要的就是自己要动手写代码,所以本章我们停一下脚步,用网上一些比较经典的面向对象的例子,我们来写一下代码,顺便也巩固一下这部分的重点内容。

实例:

写一个简易版学生上课系统:

学生具有学号,姓名,所选课程列表,每名学生被随机分配三个课程,一共有6个课程,每个课程对应一个老师来教,课程具有课程编号,课程名称,老师三个信息,老师具有老师工号,老师名称,电话三个信息。要求打印30个学生的选课情况以及任课老师的电话。 

接下来我们来一步步分析一下这个题:

首先,我们要明确写几个类,每个类包含什么什么变量和函数。根据题目分析得:我们需要写三个类,分别为学生,老师,课程。

学生类包括学号,姓名,所选课程列表。学号没要求,因为是三十个学生,可以用01-29来代表,名字就对应的用学生0到学生29。(这样比较简单,如果想严谨一些也可以用其他)。课程列表就定义一个列表来存储课程号及对应的课程。

老师同理,写对应的工号和姓名。电话号码是13位且不同,我们可以自己定义,也可以通过随机数来写电话号(这个大家可以自己根据电话号码的特点考虑一下,因为只有6个老师,这里我就直接自己定义了)

课程同理。

接下来写代码:

学生类:

class Student:
    def __init__(self,sno,sname):
        self.sno = sno   #学号
        self.sname = sname   #姓名
        self.cour_list = []    #课程列表
    def addcour(self,cour)    #添加课程
        self.cour_list.append(cour)
    def watch(self):  #查看课程
        for c in self.cour_list:
            print(f"{self.sname}选了{self.cname}课程")

这一点提一句print(f" ")
这个语句主要作用就是格式化字符串,加f后可以在字符串里面使用用花括号括起来的变量和表达式,包含的{}表达式在程序运行时会被表达式的值代替。

(其实这个watch方法在本题的要求中用不到,写这个其实是看起来更符合实际需求。不写也没问题) 

这样我们学生类就定义好了,接下来定义课程类

课程类: 

class Course:
    def __init__(self,cno,cname,teacher = None)
        self.cno = cno
        self.cname = cname
        self.teacher = teacher
    def SetTeacher(self,teacher)
        self.teacher = teacher

老师类:

class Teacher:
    def __init__(self,tno,tname,telephone):
        self.tno = tno
        self.tname = tname
        self.telephone = telephone

三个类创建完毕后,我们需要对学生,老师,课程做初始定义。 

对于课程,由于不会更改,我们用元组来存储:


c1 = Course("01", "抽烟")
c2 = Course("02", "喝酒")
c3 = Course("03", "烫头")
c4 = Course("04", "点烟")
c5 = Course("05", "倒酒")
c6 = Course("06", "给人烫头")

老师:

t1 = Teacher("01", "教师1", "13344512821")
t2 = Teacher("02", "教师2", "13701152154")
t3 = Teacher("03", "教师3", "138241865416")
t4 = Teacher("04", "教师4", "13941637063")
t5 = Teacher("05", "教师5", "15141823351")
t6 = Teacher("06", "教师6", "15214135127")

接下来我们需要把老师和课程一一对应起来,需要调用刚才写的方法:

c1.SetTeacher(t1)
c2.SetTeacher(t2)
c3.SetTeacher(t3)
c4.SetTeacher(t4)
c5.SetTeacher(t5)
c6.SetTeacher(t6)

接下来函数主体:

这一大段代码思路其实很简单,我们“长话短说,稍作解释”:

先定义一个名为stu_lst的空列表,用于存储30个学生对象。在循环中,每次迭代会创建一个新的Student对象,为了模拟学生随机选择3门课程的过程,代码使用了set来确保选择的课程索引不重复,并通过randint生成0-5之间的随机数。

在循环内部,首先创建一个空集合s,然后用while循环直到集合元素数量达到3,这时随机的3个课程索引会被添加到集合s中。接着,遍历这个集合s,将对应的课程对象(c_lst[n])添加到学生对象的cour_list中。

每创建完一个学生后,就将其添加到stu_lst列表中。最后,遍历整个stu_lst,打印每个学生的个人信息(学号和姓名),以及他们所选课程的信息,包括课程编号、课程名称和任课老师的电话。

好了,就是这么简单(坚信)。

c_lst = [c1, c2, c3, c4, c5, c6]
stu_lst = []
for i in range(30): # 循环30次.
    stu = Student(i, "学生"+str(i)) # 创建30个学生
    s = set()
    while len(s) < 3:
        s.add(randint(0, 5))
    # 把随机的三个课程索引对应的课程设置给学生
    for n in s:
        # print(n) 随机出来的课程的索引
        stu.addcour(c_lst[n])
    stu_lst.append(stu) # 加到列表
# 显示学生的选课情况以及老师的电话
for s in stu_lst:
    print(f"学生编号:{s.sno}, 学生姓名:{s.sname}")
    # 拿到学生的课程信息
    for c in s.cour_list:
        print(f"\t课程编号:{c.cno}, 课程名称: {c.cname}, 任课老师的电话是:{c.teacher.tphone}")

这样我们代码就写完了,总代码:

class Student:
    def __init__(self,sno,sname):
        self.sno = sno   #学号
        self.sname = sname   #姓名
        self.cour_list = []    #课程列表
    def addcour(self,cour):    #添加课程
        self.cour_list.append(cour)
    def watch(self):  #查看课程
        for c in self.cour_list:
            print(f"{self.sname}选了{self.cname}课程")

class Course:
    def __init__(self,cno,cname,teacher = None):
        self.cno = cno
        self.cname = cname
        self.teacher = teacher
    def SetTeacher(self,teacher):
        self.teacher = teacher

class Teacher:
    def __init__(self,tno,tname,telephone):
        self.tno = tno
        self.tname = tname
        self.telephone = telephone

c1 = Course("01", "抽烟")
c2 = Course("02", "喝酒")
c3 = Course("03", "烫头")
c4 = Course("04", "点烟")
c5 = Course("05", "倒酒")
c6 = Course("06", "给人烫头")

t1 = Teacher("01", "教师1", "13344512821")
t2 = Teacher("02", "教师2", "13701152154")
t3 = Teacher("03", "教师3", "138241865416")
t4 = Teacher("04", "教师4", "13941637063")
t5 = Teacher("05", "教师5", "15141823351")
t6 = Teacher("06", "教师6", "15214135127")

c1.SetTeacher(t1)
c2.SetTeacher(t2)
c3.SetTeacher(t3)
c4.SetTeacher(t4)
c5.SetTeacher(t5)
c6.SetTeacher(t6)

from random import randint

c_lst = [c1, c2, c3, c4, c5, c6]
stu_lst = []
for i in range(30): # 循环30次.
    stu = Student(i, "学生"+str(i)) # 创建30个学生
    s = set()
    while len(s) < 3:
        s.add(randint(0, 5))
    # 把随机的三个课程索引对应的课程设置给学生
    for n in s:
        # print(n) 随机出来的课程的索引
        stu.addcour(c_lst[n])
    stu_lst.append(stu) # 加到列表
# 显示学生的选课情况以及老师的电话
for s in stu_lst:
    print(f"学生编号:{s.sno}, 学生姓名:{s.sname}")
    # 拿到学生的课程信息
    for c in s.cour_list:
        print(f"\t课程编号:{c.cno}, 课程名称: {c.cname}, 任课老师的电话是:{c.teacher.telephone}")

大家可以参照这个思路自己写一遍,也可以对这个代码做优化,或者添加一些更符合实际需要的功能,但最重要的是,一定一定要自己写一遍,看懂和自己写出来完全是两个概念。

你可能感兴趣的:(Python学习,学习,笔记)