如何使用以前课程的输入创建课程?

Posted

技术标签:

【中文标题】如何使用以前课程的输入创建课程?【英文标题】:How do I create a class using inputs from previous classes? 【发布时间】:2013-12-08 14:18:51 【问题描述】:

我有 2 个简单的类:“学生”和“模块”,分别包含学生姓名和模块代码。我正在尝试创建一个名为“注册”的第三类,没有输入但使用“添加”方法,因此我可以添加记录以说明学生已在此模块上注册,反之亦然......到目前为止我有这个:

class Student:  
    'Class to define student details'
    def __init__(self, name):
        self.name = name
    def getName(self):
        return self.name

class Module:   
    'Class to define module codes'
    def __init__(self, code):
        self.code = code
    def getCode(self):
        return self.code

class Registration(Student, Module):
    'Class telling us what modules students are taking'
    reglist = []
    def __init__(self):
        Student.__init__(self, name)
        Module.__init__(self, code)
    def add(self, details):
        self.reglist.append(details)

为了测试它,我需要能够使用以下内容来获得指定的输出:

r = Registrations()
r.add(james,agm)
r.add(alice,agm)
r.add(alice,ipp)

mstr = ''
for m in map(str,r.modules(alice)):
    mstr = mstr+' '+m
print(alice, 'is doing the following modules:', mstr)
sstr = ''
for s in map(str,r.students(agm)):
    sstr = sstr+' '+s
print(agm, 'has the following students:', sstr)

print(r)

如何让我的注册课程具有“添加”学生和模块的功能,然后返回一个模块的学生集,然后返回一个学生学习的模块集?如果这有意义,请帮助我是 Python 新手,并且在处理更复杂的类时遇到了很多麻烦:(

【问题讨论】:

您确定这是您要使用的类层次结构吗?你真的觉得Registration是一个Student是一个Module吗? Registration 应该有一个__init__() 方法,除了通常称为self 的默认参数之外不接受任何参数。该方法应该简单地设置self.reglist = [],因此类的每个实例都有一个初始为空的注册列表,供其填充add() 方法。最重要的是,它不应该从其他两个类派生,因为它不是任何一个的“is_a”。 您应该阅读什么是 OOP。注册不是学生和模块。登记就是登记。为什么要从两个类继承?设计是错误的。先设计你的数据模型,然后再考虑实现。 注册有一个学生,有一个模块。不是学生(或模块)。 另外,也许你的意思是'james','agm'而不是james,agm 【参考方案1】:

你可以把它放在字典里,这样做:

class Registration():
    'Class telling us what modules students are taking'
    def __init__(self):
        self.regdict = 
    def add(self, name, module):
        self.regdict.setdefault(name, []).append(Modules(module))
    def modules(self, name):
        return self.regdict[name]

但是,正如其他人所提到的,您需要更好地了解类及其用法。我建议你阅读更多关于类的内容,并重新设计你的程序结构。

希望这会有所帮助!

【讨论】:

感谢您的建议,这真的很有帮助!我一直在阅读有关课程的内容,但不幸的是,没有什么可以帮助我解决这个问题。我可以制作简单的类,但我不确定如何将它们实现到另一个类中。 如果你觉得这个答案有帮助,你可以accept the answer :) 当然,您的回答帮助我弄清楚了我正在努力的部分谢谢!【参考方案2】:

如果你的类有两个方法,其中之一是__init__()、you're doing it wrong。 (请观看此视频。它包含非常好的设计建议。)

在这种情况下,只需在 Module 类中放置一个register_student() 方法。 报名上课是动词,不是名词。

如果记录在创建后通常不需要修改,您可以使用元组而不是类。例如。如果模块类是由模块代码和学生列表组成的元组,则不能更改模块代码,但可以修改学生列表。

In [1]: module = ('Algebra 101', 24, [])

In [2]: module[2].append('John Doe')

In [3]: module[2].append('Jane Doe')

In [4]: module
Out[4]: ('Algebra 101', 24, ['John Doe', 'Jane Doe'])

如果你使用collections.namedtuple()可能会更容易阅读:

In [5]: from collections import namedtuple

In [6]: Module = namedtuple('Module', ['name', 'code', 'students'])

In [7]: a = Module('Algebra 101', 24, ['John Doe', 'Jane Doe'])

In [8]: a
Out[8]: Module(name='Algebra 101', code=24, students=['John Doe', 'Jane Doe'])

In [9]: a.name
Out[9]: 'Algebra 101'

In [10]: a.students
Out[10]: ['John Doe', 'Jane Doe']

此外,一般对于名称等简单属性,您不需要在 Python 类中获取和设置方法。除非您想做其他事情,例如验证输入。

【讨论】:

感谢您的建议,不幸的是,这个问题要求我使用课程,并且还说我需要制作 3 个课程,我拥有的 2 个简单的学生和模块课程,以及第 3 个更复杂的课程注册是我正在挣扎的那个。不过感谢您的帮助:) 猜想,你的老师已经喝了太多Java了。 :-)

以上是关于如何使用以前课程的输入创建课程?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用JSP进行课程表的增删改查?关键是Mysql数据库里面表的关系如何建立?

如何改进我的课程以创建输出文件

用于创建课程列表的 SQL 查询。通过...分组?

如何创建表单来编辑一对多关系?

课程作业01的思路

关于课程设计实训体会