Список Python для хранения экземпляра класса?

Учитывая класс Python class Student(): и список names = []; затем я хочу создать несколько экземпляров Student() и добавьте их в список names,

names = [] # For storing the student instances
class Student():
    def __init__(self, score, gender):
        self.score = score
        self.gender = gender

И теперь я хочу проверить множество всех студентов, я могу сделать это как это?

scores = []
for i in names:
    if i.gender ==  "Male":
        scores.append(i.score)

Мой вопрос: Как создать список, который может (если мог быть сделан каким-либо оператором), хранят экземпляр Student? Или скорее когда я пишу names = [], как я мог заявить каждый элемент в names экземпляр Student так, чтобы я мог использовать attributs этого элемента несмотря на Python, слабый тип? Я надеюсь, что ясно выразился ;)

Могу я писать как:

    for i in range(len(names)):
        student = Student()
        student = names[i]
        if student.gender == "Male":
            # Whatever

Я предполагаю нет...

15
задан matt b 14 August 2010 в 15:48
поделиться

2 ответа

Вы пробовали использовать указанный выше код? Он должен работать нормально. Вы можете сжать его до:

scores = [ student.name for student in names if student.gender == "Male" ]

Обратите внимание, что называть список names вводит в заблуждение, поскольку это список экземпляров Student .

Вы не можете определить список как список экземпляров Student; это не то, как работает Python.

Вы спрашиваете, как создать список, который вы назвали именами ?

names = [ ]
for ( score, gender ) in <some-data-source>:
    names.append( Student( score, gender ) )

, что, конечно, эквивалентно

names = [ Student( score, gender ) for score, gender in <some-data-source> ]

и, в свою очередь,

names = [ Student( *row ) for row in <some-data-source> ]

Если вам нужно много делать обработки для каждой строки, то вы можете либо переместить обработку в отдельную функцию, либо использовать цикл для .

def process_row( row ):
    ...
    return score, gender

names = [ Student( *process_row( row ) ) for row in <some-data-source> ]

В ответ на ваше изменение, я думаю, вы пытаетесь объявить типы переменных в Python. Вы писали:

for i in range(len(names)):
    student = Student()
    student = names[i]
    if student.gender == "Male":
        # Whatever

Каково назначение строки student = Student () - вы пытаетесь объявить тип переменной student ? Не делай этого. Следующее сделает то, что вы планировали:

for student in students:
   if student.gender == "Male":
       # Whatever

Обратите внимание на несколько вещей:

  1. Нам не нужно перебирать range (n) , а затем искать каждый экземпляр в именах ; итерация по каждому элементу контейнера является целью цикла for .
  2. Вам не нужно делать никаких заявлений о том, что такое student - это может быть строка, логическое значение, список, Student , что угодно. Это динамическая типизация . Точно так же студентов не обязательно должны быть списком; вы можете перебирать любые итерации .
  3. Когда вы напишете student.gender , Python получит атрибут пол для student или вызовет исключение, если его нет.
14
ответ дан 1 December 2019 в 03:23
поделиться

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

Однако это не мешает вам получить доступ к атрибутам объекта. Это прекрасно работает:

names = [Student(1,"Male"), Student(2,"Female")]
scores = []
for i in names:
    if i.gender ==  "Male":
        scores.append(i.score)

Однако более питонично писать это, используя понимание списка:

names = [Student(1,"Male"), Student(2,"Female")]
scores = [i.score for i in names if i.gender == "Male"]
5
ответ дан 1 December 2019 в 03:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: