如何使用以前课程的输入创建课程?
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了。 :-)以上是关于如何使用以前课程的输入创建课程?的主要内容,如果未能解决你的问题,请参考以下文章