首页 > 解决方案 > 打印类对象时如何更改输出以避免获取其地址

问题描述

我有 2 个班级:学生和教室。我希望学生班级获得学生姓名和学生成绩列表。我还添加了一个计算列表平均值的方法,一个获取学生姓名的方法,以及一个返回姓名和平均值的元组的方法。我希望 ClassRoom 类获取学生对象列表并定义一个方法,该方法在打印 ClassRoom 对象而不是对象的地址时返回元组列表。

例子:

Moses = Student("Moses", [97.5, 87, 60])
Dan = Student("Dan", [85, 96, 100])
students = ["Moses", "Dan"]
classRoom = ClassRoom(students)
print(classRoom)
# The output should be:
[("Moses", 81.5), ("Dan", 93.66666666666667)]

我知道有一个使用方法的选项:def __str__(self),但我不知道如何正确使用它。

这是我迄今为止尝试过的:

class Student():

    def __init__(self, student_name, grads_list):
        self.__name = student_name
        self.__grads = grads_list

    def get_grade_avg(self):
        return sum(self.__grads) / len(self.__grads)

    def get_name(self):
        return self.__name

    def get_name_and_average(self):
        return self.__name, self.__grads
class ClassRoom:
    def __init__(self, student_list):
        self.__students = student_list

    def __str__(self):
        for a_student in self.__students:
            return "[" + str(a_student.get_name_and_average) + "]"

标签: pythonpython-3.x

解决方案


尝试这个:

首先,当您创建 ClassRoom 对象的实例时,您需要一个学生对象列表,而不是字符串列表:

students = [Moses, Dan]
classRoom = ClassRoom(students)

您还需要为学生类创建一个str方法:

class Student():

    def __init__(self, student_name, grads_list):
        self.__name = student_name
        self.__grads = grads_list

    def get_grade_avg(self):
        return sum(self.__grads) / len(self.__grads)

    def get_name(self):
        return self.__name

    def get_name_and_average(self):
        return self.__name, self.__grads

    def __str__(self):
        return "{}, {}".format(self.__name, self.get_grade_avg())

最后修复ClassRoom 类的str :

class ClassRoom:
    def __init__(self, student_list):
        self.__students = student_list

    def __str__(self):
        return "[{}]".format(", ".join(map(lambda x: "(" + str(x) + ")", self.__students)))

推荐阅读