我是python的新手,我正在阅读python文档,并且在http://docs.python.org/2/howto/sorting.html#key-functions的给定示例中,我被卡住了,但我并没有明白它是如何工作的。
我正在使用eclipse Pydev运行此代码..
class Student:
student_object = [
('john', 'a', 15),
('as', 'C', 12),
('dave', 'B', 10)
]
def __init__(self, name, grade, age):
self.name = name
self.grade = grade
self.age = age
def __repr__(self):
return repr((self.name, self.grade, self.age))
print sorted(Student.student_object, key=lambda Student: Student.age)
错误
Traceback (most recent call last):
File "C:\Users\user1\workspace\demPython\src\ru.py", line 26, in <module>
print sorted(Student.student_object, key=lambda Student: Student.age)
File "C:\Users\user1\workspace\demPython\src\ru.py", line 26, in <lambda>
print sorted(Student.student_object, key=lambda Student: Student.age)
AttributeError: 'tuple' object has no attribute 'age'
类和方法如何在python中工作?为什么这段代码不起作用?
修改
但我改变了最后一行并用给定的行替换
print sorted(Student.student_object, key=lambda student: student[0])
它正在工作,并为我提供输出[('as', 'C', 12), ('dave', 'B', 10), ('john', 'a', 15)]
答案 0 :(得分:4)
它不起作用,因为student_object
中的项目不是Student
类的实例,它们只是普通的元组。这就是错误为'tuple' object has no attribute 'age'
的原因。
您需要先创建学生对象:
class Student(object):
def __init__(self, name, grade, age):
self.name = name
self.grade = grade
self.age = age
def __repr__(self):
return '{0.name} {0.grade} {0.age}'.format(self)
students = [Student('john','a',15), Student('as','C',12), Student('dave','B',10)]
print sorted(students, key=lambda x: x.age)
答案 1 :(得分:2)
age
中没有名为student_object
的字段。所以你需要这个
print sorted(Student.student_object, key=lambda Student: Student[2])
或者,您可以像这样使用itemgetter
from operator import itemgetter
getage = itemgetter(2)
print sorted(Student.student_object, key = getage)
注意:请勿使用大写字母命名变量。
答案 2 :(得分:1)
您的Student.student_object
只是
student_object = [
('john', 'a', 15),
('as', 'C', 12),
('dave', 'B', 10)
]
并且与Student类无关,除了它在“内部”之外。像
这样的东西class Student:
def __init__(self, name, grade, age):
self.name = name
self.grade = grade
self.age = age
def __repr__(self):
return repr((self.name, self.grade, self.age))
student_object = [ Student('john', 'a', 15),
Student('as', 'C', 12),
Student('dave', 'B', 10) ]
print sorted(student_object, key=lambda x: x.age)
而是,因为数组的每个元素都是一个Student实例,所以定义了年龄attr。
答案 3 :(得分:1)
类定义对象的结构和行为,即实例。当您像在此处一样定义类Student
时,Python会创建一个函数Student()
,称为初始化程序,您可以使用该函数创建该类的实例。由于您为Student提供了__init__
方法,因此Python将安排将其作为初始化程序的实现进行调用。
因此,要创建Student对象,您需要使用__init__
方法指定的参数调用Student的初始值设定项。例如:Student('john', 'A', 15)
。
您的关键功能(即使用lambda
表达式创建的匿名函数)希望收到具有age
属性的内容。据推测,这应该是一个对象,它是Student类的一个实例。但是:
Student
完全不正确。学生不参考这里的课程;它就像任何其他函数参数一样,只是为您将在此函数中接收的参数指定一个名称。请注意,与某些语言不同,在Python中声明参数时,不必提及类型名称和变量名称;您只需声明变量名称并开始使用它。还要注意,用大写字母命名变量是非常糟糕的Python样式,正是出于这个原因:它使人们混淆什么是变量,什么是类等等。sorted()
,因此函数接收的项是元组,您可以将其视为Python提供的内置tuple
类型的实例。因此,首先要关注获取学生列表,并准确了解创建对象的工作原理。一旦你这样做,就像你已经完成那样调用sorted
就行了。然后,修复你的关键功能,使用小写的student
参数,为了理智,你很高兴!