2010-08-14 83 views
12

鉴于蟒类class Student():和列表names = [];然后我想创建多个实例的Student()并将它们添加到列表中names用于存储类实例的Python列表?

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

响应您的编辑:没有,因为你打电话'学生()你不能写'不带参数,尽管它需要2.如果你删除这条线,它会工作。 – sepp2k 2010-08-14 15:47:59

+1

@ sepp2k,是的,参数不符合Student construtor,所以这会导致错误。好吧,我认为我应该考虑我的问题,因为我现在在表达我的问题时遇到了困难,如果您认为通过代码更多,您可能会了解它失败的位置,但我发布的内容并不是我的观点 – ladyfafa 2010-08-14 15:51:38

+0

。 'student = Student()'这一行试图创建一个新的'Student'实例并将它存储在变量'student'中。这将失败,因为构造函数缺少一些必需的参数。我想你正在试图宣布“学生”的类型?你不必在Python中这样做。它将在运行时为您解决。还要注意,你可以直接在'names'的元素上用''为学生名称:...'进行迭代。 – katrielalex 2010-08-14 18:38:32

回答

11

你尝试上面的代码?它应该工作正常。你可以凝结成:

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。您写道:

​​3210

什么是线student = Student()的目的 - 你想声明变量student的类型?不要这样做。下面将做你想要的结果:

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

注意几件事情:

  1. 我们并不需要遍历range(n)然后每个实例查找在names;遍历容器的每个元素是for循环的目的。
  2. 您不需要对student是什么声明 - 它可以是字符串,布尔值,列表,Student,无论如何。这是动态打字。同样,students不一定是一个列表;你可以迭代任何可迭代的
  3. 当你编写student.gender时,Python将得到gender属性student,或者如果它没有一个会引发异常。
+1

谢谢你的回答,我看到你的观点,但我不知道如何表达我的问题,虽然 – ladyfafa 2010-08-14 15:49:01

+0

令人讨厌,但浓缩的外观相当简洁,在某些情况下,if语句可能包含一堆TODO,这种形式是否可行,可能不那么直截了当? – ladyfafa 2010-08-14 15:55:58

+0

咦?什么是'TODO'? – katrielalex 2010-08-14 16:00:07

4

首先python是而不是微弱类型。但是它是动态类型的,所以你不能为你的列表指定一个元素类型。

但是,这并不妨碍您访问对象的属性。这只是正常:

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

然而更Python使用列表理解来写:

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

其实,根据大多数定义,我认为Python *是*弱类型 - 支持重载,隐式类型转换,多态性...如果这不是“弱类型”,那是什么?无可否认,这个术语并不意味着什么。 – katrielalex 2010-08-14 16:01:58

+0

我也想说Python动态类型。 OP只知道相反的:* static * types。看起来* strong *和* weak *对于非常相似的概念来说是相当不好的名字。# – 2010-08-14 16:32:00

+4

编号弱类型表示类型内部没有太大差异。因此,您可以将字符串变量添加到数字中,就像它也是一个数字一样。 在Python中你必须知道变量类型。但它可以仅在运行时发现或动态发现。 – Odomontois 2010-08-14 16:33:58

2

我是相当新的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'] 
相关问题