Получить атрибут из объекта в списке объектов, созданных циклом - PullRequest
1 голос
/ 02 августа 2020

Я создаю несколько объектов класса Student, используя al oop и сохраняю их в списке object_list.

Теперь я хочу создать функцию, которая возвращает мне одну конкретную c атрибут определенного объекта из object list. Например, атрибут «имя» третьего созданного объекта.

Возможно, это можно сделать с помощью функции getattr(), но проблема в том, что каждый созданный объект называется одинаково («Студент») .

Есть ли способ проиндексировать описание объекта «Студент» при их создании в l oop, например Student_1, Student_2, Student_3?

Это мой код, в котором я создаю объекты:

# Definition of the class Student
class Student(object):
    name = ""
    degree = ""
    grade = ""
    
    def __init__(self, name, degree, grade):
        self.name = name
        self.degree = degree
        self.grade = grade


object_list = []

# Create objects
def create_objects(data):
    x = 0

    # Loop through lists of data
    for list in data[1:]:
        x = x + 1
        # Get values from data to instantiate objects
        object_list.append(Student(get_value(data, x, 0), get_value(data, x, 1), get_value(data, x, 2))

    return object_list

Теперь я хочу создать функцию, которую я могу использовать следующим образом:

get_attribute(object_list, "Student_3", "name")

Как мне вызвать определенный объект c из object_list?

Ответы [ 4 ]

1 голос
/ 02 августа 2020

Вероятно, вы не захотите определять свои атрибуты на уровне класса, а также на уровне экземпляра:

# Definition of the class Student
class Student(object):
    # no class attributes
    def __init__(self, name, degree, grade):
        # these are all instance attributes
        self.name = name
        self.degree = degree
        self.grade = grade

Простой способ получить объект, соответствующий определенным критериям из списка, - использовать фильтр, который вы можете сделать с помощью функции filter() или просто поместив if в понимание:

>>> object_list = [Student("Bob", "first", "A"), Student("Biff", "second", "B"), Student("Betty", "third", "C")]
>>> [s for s in object_list if s.name == "Biff"]
[<__main__.Student object at 0x000001855B7D2D60>]
>>> [s for s in object_list if s.name == "Biff"][0].degree
'second'

Если вы хотите использовать имя атрибута в виде строки, вы действительно можете используйте getattr:

>>> [s for s in object_list if getattr(s, "name") == "Biff"][0].degree
'second'

Однако, если вы делаете что-то подобное, вы, вероятно, захотите использовать обычный dict вместо объекта:

>>> def student(name, degree, grade):
...     return {"name": name, "degree": degree, "grade": grade}
...
>>> object_list = [student("Bob", "first", "A"), student("Biff", "second", "B"), student("Betty", "third", "C")]
>>> [s for s in object_list if s["name"] == "Biff"]
[{'name': 'Biff', 'degree': 'second', 'grade': 'B'}]
0 голосов
/ 02 августа 2020

Вы можете использовать словарь для решения вашей проблемы вместо списка.

Вы просто создаете новый ключ словаря с x итеративным значением.

object_dict = {}

# Create objects
def create_objects(data):
    x = 0

    # Loop through lists of data
    for list in data[1:]:
        x = x + 1
       
        # Get values from data to instantiate objects
        object_dict['Student_' + str(x)] = Student(get_value(data, x, 0), get_value(data, x, 1), get_value(data, x, 2))

    return object_dict

Теперь что касается как функцию get_attribute(object_list, "Student_3", "name"). Это может выглядеть примерно так.

def get_attribute(object_dict, student, attribute):
  student_num = object_dict[student]
  return student_num.attribute
   

Надеюсь, это поможет !! Удачного кодирования!

0 голосов
/ 02 августа 2020

в первую очередь рекомендую использовать перечисление. Вам не нужно повторять x вручную. Во-вторых, вы можете объединить несколько строк и инициировать своего ученика.

    for idx, list in enumerate(data[1:]):
        #You dont need x anymore


        name = str(get_value(data, x, 0)) + str(idx) #Append the Number of the index
        degree = get_value(data, x, 1)
        grade = get_value(data, x, 2)

        object_list.append(Student(name, degree, grade)

Вы можете реализовать функцию, как вы сказали, с помощью getattr ()

    def get_attribute(list, value, attribute):

        for object in list:
            if getattr(object, attribute) == value:
                return object

        #If nothing has the name
        return None
0 голосов
/ 02 августа 2020
def get_attribute(obj_list, index, attribute):
    return getattr(obj_list[index], attribute)

# Gets the name of the 3rd student created
get_attribute(object_list, 3, "name")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...