给出一个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
的一个实例,这样我就可以使用这个元素的属性,尽管python是弱类型的?我希望我能说清楚;)
我可以这样写:
for i in range(len(names)):
student = Student()
student = names[i]
if student.gender == "Male":
# Whatever
我猜不是......
答案 0 :(得分:14)
您是否尝试过以上代码?它应该工作正常。您可以将其浓缩为:
scores = [ student.name for student in names if student.gender == "Male" ]
请注意,调用列表names
会产生误导,因为它是Student
个实例的列表。
您无法将列表定义为Student实例列表;这不是Python的工作方式。
您是否在询问如何创建名为names
的列表?
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> ]
如果您需要对每一行进行大量处理,那么您可以将处理移动到单独的函数中或使用for
循环。
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)
,然后在names
中查找每个实例;迭代容器的每个元素是for
循环的目的。student
是什么声明 - 它可以是字符串,布尔值,列表,Student
,等等。这是动态类型。同样,students
不一定是列表;你可以迭代任何 iterable 。student.gender
时,Python将获得gender
的{{1}}属性,如果没有,则会引发异常。 答案 1 :(得分:5)
首先,python是而不是弱类型。但它是动态类型的,因此您无法为列表指定元素类型。
但是,这并不妨碍您访问对象的属性。这很好用:
names = [Student(1,"Male"), Student(2,"Female")]
scores = []
for i in names:
if i.gender == "Male":
scores.append(i.score)
然而,使用列表理解来写这个更加pythonic:
names = [Student(1,"Male"), Student(2,"Female")]
scores = [i.score for i in names if i.gender == "Male"]
答案 2 :(得分:3)
我对OOP相当新,但是这不是很好吗? name_list
是一个类变量,每次创建新的Student
对象时,它都会被添加到Student.name_list
。比如说你有一个方法cheat(self)
,你想对第三个学生执行,你可以运行Student.name_list[2].cheat()
。代码:
class Student():
name_list = []
def __init__(self, score, gender):
Student.name_list.append(self)
self.score = score
self.gender = gender
#this is just for output formatting
def __str__(self):
return "Score: {} || Gender: {}".format(self.score, self.gender)
#again for output formatting
def update(): print([str(student) for student in Student.name_list])
update()
Student(42, "female")
update()
Student(23, "male")
update()
Student(63, "male")
Student(763, "female")
Student("over 9000", "neutral")
update()
输出:
[]
['Score: 42 || Gender: female']
['Score: 42 || Gender: female', 'Score: 23 || Gender: male']
['Score: 42 || Gender: female', 'Score: 23 || Gender: male', 'Score: 63 || Gender: male', 'Score: 763 || Gender: female', 'Score: over 9000 || Gender: neutral']