在我下面的学生子类中,我将self.courses
dict属性中存储的手动输入成绩的平均GPA计算为{course:grade}。
用户应该能够在控制台中输入>>> print(fred.gpa),因为fred是一个合适的学生实例,成绩为self.courses
,并且应该得到3.8
(例如)打印到控制台。
但是,3.8
不会打印到控制台,而是<bound method Student.gpa of <college.Student object at 0x7ff55e122ad0>>
据我所知,这是打印功能的结果,但我想只使用print(fred.gpa)打印一个数字而不是fred.gpa()
这是否意味着我必须将gpa.Student的输出转换为字符串?
这是我的代码:
def __init__(self, name, cid, email):
self.courses = {}
super().__init__(name, cid, email)
def add_course(self, course):
if course in self.courses:
# duplicate courses not allowed
raise ValueError
print("student is already registered for this course")
else:
self.courses.update({course:0})
return self
def update_grade(self, course, grade):
if course not in self.courses:
# student must be registered in class to receive grade
raise ValueError
print("student is not registered for this course")
else:
self.courses[course] = float(grade)
return self
def gpa(self):
grades = list(self.courses.values())
totGPA = sum(grades)/len(grades)
return str(totGPA)
答案 0 :(得分:1)
您需要的是能够实现某些方法的东西,但访问它作为非方法属性。事实证明这很简单 - 它被称为property
,它的工作原理如下:
class Student:
@property
def gpa(self):
# Rest of the implementation, unchanged
钽哒!
请注意,您可以稍微修改一下gpa
的实现:sum
可以采用任何可迭代(它不必是列表)和dicts(及其keys
},values
和items
次观看)有一个长度,所以你可以这样做:
@property
def gpa(self):
return sum(self.courses.values())/len(self.courses)
我已经省略了您对str
的来电,因为从您的问题看来,这是第一次尝试解决您的问题。如果你因为其他原因需要它,你可以恢复它。