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类的方法,而不创建更多的子类?
答案 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
属性包含所有用户的课程,每个课程都有自己的setGrade
和getGrade
方法。因此,您只需要确定哪个是该列表中的相关课程,并调用其方法。类似的东西:
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)
但是,你应该真正做正确的继承。