打印方法输出为字符串,而不是函数

时间:2015-03-03 21:11:05

标签: python oop python-3.x

在我下面的学生子类中,我将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)

1 个答案:

答案 0 :(得分:1)

您需要的是能够实现某些方法的东西,但访问它作为非方法属性。事实证明这很简单 - 它被称为property,它的工作原理如下:

class Student:
    @property
    def gpa(self):
        # Rest of the implementation, unchanged

钽哒!

请注意,您可以稍微修改一下gpa的实现:sum可以采用任何可迭代(它不必是列表)和dicts(及其keys },valuesitems次观看)有一个长度,所以你可以这样做:

@property
def gpa(self):
    return sum(self.courses.values())/len(self.courses)

我已经省略了您对str的来电,因为从您的问题看来,这是第一次尝试解决您的问题。如果你因为其他原因需要它,你可以恢复它。