如何通过Python中的另一个类访问一个类的成员?

时间:2013-05-07 10:46:16

标签: python class

class courseInfo(object):

    def __init__(self, courseName):
        self.courseName = courseName
        self.psetsDone = []
        self.grade = "No Grade"

    def setGrade(self, grade):
        if self.grade == "No Grade":
         self.grade = grade

    def getGrade(self):
        return self.grade


class abc(object):
    def __init__(self, courses):
        self.myCourses = []
        self.Pset = []
        self.grade = {}
        for course in courses:
            self.myCourses.append(courseInfo(course))

     def setGrade(self, grade, course="6.01x"):
        """
        grade: integer greater than or equal to 0 and less than or 
          equal to 100
        course: string 

        This method sets the grade in the courseInfo object named 
          by `course`.   

        If `course` was not part of the initialization, then no grade is 
          set, and no error is thrown.

        The method does not return a value.
        """

    def getGrade(self, course="6.02x"):
        """
        course: string 

        This method gets the grade in the the courseInfo object 
          named by `course`.

        returns: the integer grade for `course`.  
        If `course` was not part of the initialization, returns -1.
        """

xyz = abc( ["6.00x","6.01x","6.02x"] )
xyz.setGrade(100)

print xyz.getGrade(course="6.01x")
print Xyz.getGrade(course="6.02x")

问题是如何从python中的另一个基类访问一个基类的成员? 在这里,从abc类访问courseInfo类的方法,而不创建更多的子类?

4 个答案:

答案 0 :(得分:0)

你正在编写,并在编写Python时用C ++思考。

如果我有courseInfo的实例,请说c然后在程序的任何地方我可以执行以下操作:

c.setGrade('a')
g = c.getGrade()

甚至

c.grade = 'this is not really a grade'

类实例的每个成员都是'public',Python封装的工作原理是“We're all adults here”,所以除非我允许,否则不要触及我的私有。另一个约定是属性名称开头的下划线警告你它是一个私有属性,你真的不应该触摸它。如果courseInfo

self._grade - 'No Grade'

然后您知道自己有危险访问_grade。这在C ++中也是如此,它更难以涉及强制转换。

人们可能会稍后回答self.__grade 处理方式不同,但它并不会使其成为私有的,作为初学者,您最好避开构造,直到您理解为什么吸气剂和制定者是在Python中比在Java和C ++中更不常见。

答案 1 :(得分:0)

你的问题不是很明确,这有帮助吗?

class abc(object):

    def __init__(self, courses):
        [...]
        self.my_courses = {course_name: courseInfo(course_name) 
                           for course_name in courses}

    def setGrade(self, grade, course="6.01x"):
        course = self.my_courses[course]
        course.setGrade(grade)

    def getGrade(self, course="6.02x"):
        course = self.my_courses[course]
        return course.getGrade()

我将您的课程存储在list中,而不是dict,以便能够按名称查找它们。还有其他方法可以做到这一点,但这是简单而优雅的(并且比每次迭代列表更有效。)

答案 2 :(得分:0)

这似乎是简单的组合,与“访问基类”无关。您的courses属性包含所有用户的课程,每个课程都有自己的setGradegetGrade方法。因此,您只需要确定哪个是该列表中的相关课程,并调用其方法。类似的东西:

for c in self.myCourses:
    if c.courseName == course:
        c.setGrade(grade)

我不知道您是否对abc及其__init__方法的结构有任何控制权,但如果您将课程存储为按名称键入的字典,而不是一个清单。

答案 3 :(得分:0)

  

问题是这种格式,我想要一种方法来访问   任何基类的成员,而不创建任何进一步的子类

好的,既然您引用了courseInfo中的所有myCourses,就可以执行此操作:

def setGrade(self, grade, course="6.01x"):
    for i in self.myCourses:
        if i.courseName == course:
            i.setGrade(grade)

但是,你应该真正做正确的继承。