Учитывая класс 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
Я предполагаю нет...
Вы пробовали использовать указанный выше код? Он должен работать нормально. Вы можете сжать его до:
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
Обратите внимание на несколько вещей:
range (n)
, а затем искать каждый экземпляр в именах
; итерация по каждому элементу контейнера является целью цикла for
. student
- это может быть строка, логическое значение, список, Student
, что угодно. Это динамическая типизация . Точно так же студентов
не обязательно должны быть списком; вы можете перебирать любые итерации . student.gender
, Python получит атрибут пол
для student
или вызовет исключение, если его нет. Во-первых, 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"]