【问题标题】:A better way to call Class Methods from List of Class Objects - Python从类对象列表中调用类方法的更好方法 - Python
【发布时间】:2020-01-29 16:22:13
【问题描述】:

我正在研究 Python 类,发现无法通过循环访问此类对象的列表来从类对象调用类方法。下面是一个示例代码:

def show_student_details(*s_list):
    for s in s_list:
        print("Roll Number: ", s.get_roll_no())
        print("Name: ", s.get_name())
        print("Phone: ", s.get_phone())
        print("Marks: ", s.get_marks())

Student类的代码是:

class Student:

    def __init__(self, roll_no=0, name="", phone="", marks=-1):
        self.__roll_no = roll_no
        self.__name = name
        self.__phone = phone
        self.__marks = marks

    def get_roll_no(self):
        return self.__roll_no

    def get_name(self):
        return self.__name

    def get_phone(self):
        return self.__phone

    def get_marks(self):
        return self.__marks

通过传递 Student 类的一些对象来运行这段代码会出现以下错误:

  File "main.py", line 88, in <module>
    show_student_details(students)
  File "main.py", line 12, in show_student_details
    print("Roll Number: ", s.get_roll_no())
AttributeError: 'list' object has no attribute 'get_roll_no'

我的理解是List 本身就是一个类,Python 解释这段代码就好像我在列表对象上调用get_roll_no() 函数一样。

我用谷歌搜索了这个问题,发现map()methodcaller() 可以用来调用类方法,但它们对我不起作用。

我知道这个问题已经在 StackOverflow 上被问过多次,但我认为他们都没有解决我的问题,即“通过从类列表中一一选择对象来调用对象的多个类方法对象。'

任何帮助将不胜感激。提前致谢。

【问题讨论】:

    标签: python python-3.x oop


    【解决方案1】:

    假设您将学生列表传递给函数,例如 ([<__main__.Student object at 0x122d85990>, <__main__.Student object at 0x122d85910>],) ,你可以使用:

    def show_student_details(*s_list):
    for s in s_list[0]:
        print("Roll Number: ", s.get_roll_no())
        print("Name: ", s.get_name())
        print("Phone: ", s.get_phone())
        print("Marks: ", s.get_marks())
    

    因为 *s_list 将您的输入转换为列表。或者,您应该能够只使用

    def show_student_details(s_list):
    for s in s_list:
        print("Roll Number: ", s.get_roll_no())
        print("Name: ", s.get_name())
        print("Phone: ", s.get_phone())
        print("Marks: ", s.get_marks())
    

    【讨论】:

    • 谢谢@Alireza。在这里使用可变长度参数会导致问题。现在我明白了。
    • 另一种方法是在函数调用时解压缩列表:show_student_details(*s_list)。这取决于 OP 真正想要什么
    • @Tryph 这对我不起作用。但是 Alireza 答案中的第二个代码效果很好。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2011-05-17
    • 2020-12-16
    • 2010-12-15
    • 1970-01-01
    • 2012-07-13
    • 2019-05-06
    • 1970-01-01
    相关资源
    最近更新 更多