【问题标题】:Trouble forming the classes and methods for object orientated python project难以形成面向对象的python项目的类和方法
【发布时间】:2016-07-27 04:10:14
【问题描述】:

我正在从事项目,但我正在努力正确使用类和面向对象而不偷工减料。

我现在将发布项目以澄清我的需求:

一个学生对象包括:

FirstName: string
LastName: string
Birthdate: tuple, such as (1,17,1998)
TechID: string
Grades: list of tuples, such as [(3127,”C”,4),(2496,”B”,3),(6703,”D”,3)]
 So one student might look like this:

FirstName: “Bob”
LastName: “Smith”
Birthdate: (2,17,1998)
TechID: “43546578”
Grades: [(5930,”B”,4),(7660,”C”,4),(3122,”C”,3),(5438,”C”,2),
   (6730,”C”,4),(4268,”C”,4),(5709,”D”,4),(8071,”B”,4)]

每个学生的数据都可以在文本文件中找到。你的程序 应酌情从每个文件中读取数据。 (不要 更改输入文件的格式。)您的 getData 函数应该 一次读取所有数据。一旦所有的数据都 被读入适当的结构,该数据应该被传递 回到主程序。你的程序不应该来回走 在读取数据和返回数据之间。

创建学生列表。不要将学生一个一个地处理为 它们被创建或被放置在列表中。创建一个学生, 将其添加到学生对象列表中,重复。一旦名单 学生完成后,通过列表输出每个学生的报告 学生。

您将需要三种方法来处理学生对象。

  1. currentAge:学生几岁?

  2. 当前 GPA:学生的 GPA 是多少?

  3. 报告:将该学生的输出添加到输出文件中。

每个输出文件项应如下所示:

Bob Smith (#43546578)
Age:  18 (02/17/1998)   note the mm/dd/yyyy format
GPA: 2.14 (29 credits)

至少会有三个 Python 文件。一个用于 getData,一个用于 学生类及其方法,以及一个与主程序。

student.txt 如下所示:

87965164,Paris,Yu,6/27/1997
87965219,Heath,Moss,10/13/1996
87965187,Cale,Blankenship,10/22/1995
87965220,Terrence,Watkins,12/7/1996
87965172,Ansley,Padilla,3/30/1997

grades.txt 看起来像这样:

87965220,2915D3
87965219,7252C3
87965164,6964D3
87965219,5569A4
87965220,8923C4
87965187,2818A4
87965187,5293C3
87965187,5753C3
87965172,8581B3
87965219,3904B4
87965220,5801D3
87965219,3418A3
87965219,3544C4
87965220,7626A4
87965187,5092D3
87965187,3312C4
87965164,8119C4

这是我的代码。我的问题是我开始意识到我没有很好地利用类和对象。我正在寻找一些关于我应该如何进行这个项目的指导或示例。如果有人能够帮助创建应该存在哪些类和方法的模板,那就太棒了。

import re

class GetData:
    fullList = []
    birthdays = []
    students = []

    def studentsInFile(self):
        count = 0            
        inputStudents = open('students.txt' , 'r')
        for line in inputStudents:
            self.fullList.append(re.split('[,/]',line.strip()))

        inputStudents.close()            
        numOfStudents = len(self.fullList)

        while count != numOfStudents:
            self.students.append(self.fullList[count][0])
            self.birthdays.append(self.fullList[count][3:6])
            self.birthdays[count][:] = [int(x) for x in self.birthdays[count]]
            count += 1

    def gradesInFile(self):
        inputGrades = open('grades.txt' , 'r')                  
        inputGrades.close()

getData = GetData()
getData.studentsInFile()

【问题讨论】:

    标签: python class object


    【解决方案1】:

    你是对的,你以完全错误的方式完成了抽象。

    首先我应该告诉你什么是 OOP 以及为什么你应该/不应该使用它。简单来说面向对象编程(OOP)是一种编程paradigm,简单来说就是基于对象的概念。对象是您可以在脑海中想象的东西,就像对象一样。所以 Car 是一个对象,Dog 是一个对象,Student 是一个对象等等。而类是这些对象的原型。

    现在,对象可能包含用于描述它们的数据以及允许它们与程序(或在我们的小抽象中 - 与世界)交互的方法/函数/过程。因此,例如,您可以养一只棕色的狗,它可以无休止地鸣叫或盯着您看,直到您给他想要的东西(显然是食物和背部抓挠)。更困难的例子可能是 Car,它可能与 Engine 对象和 Wheel 对象等进行交互。一切都取决于你想对抽象细节进行多深,因为你可以简单地创建一个 Car 对象,它具有转动轮子的能力,启动引擎,加速,它的车轮位置,引擎状态和速度可能表示为数据(变量或类属性,这是 Python 中的两个不同的东西)。一切都取决于您想要什么和需要什么。

    在您的示例中,您尝试将GetData 表示为一个对象,因此您编写了类原型并创建了一个对象。我已经非常努力地尝试了,但我根本无法将GetData 想象成一个对象,所以即使有可能它也可能是错误类设计的示例。

    更好的解决方案是构建一个Student 类,它可能包含您在帖子开头提到的数据字段和setDateFromText 之类的方法,它将Student.agestring 提供为参数 - 例如 02/17/1998,您在帖子中作为示例给出,并将文本生日存储在单独的变量中。

    在这个例子中你也不需要正则表达式。内置str类的split方法绰绰有余。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-03
      • 1970-01-01
      • 2012-05-24
      相关资源
      最近更新 更多