Python类不使用排序函数

时间:2013-12-12 06:57:46

标签: python python-2.7

我是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)]

4 个答案:

答案 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类的一个实例。但是:

  1. 将参数命名为Student完全不正确。学生不参考这里的课程;它就像任何其他函数参数一样,只是为您将在此函数中接收的参数指定一个名称。请注意,与某些语言不同,在Python中声明参数时,不必提及类型名称和变量名称;您只需声明变量名称并开始使用它。还要注意,用大写字母命名变量是非常糟糕的Python样式,正是出于这个原因:它使人们混淆什么是变量,什么是类等等。
  2. 实际传递给您的关键功能的对象不是学生。由于您在元组列表上调用sorted(),因此函数接收的项是元组,您可以将其视为Python提供的内置tuple类型的实例。
  3. 因此,首先要关注获取学生列表,并准确了解创建对象的工作原理。一旦你这样做,就像你已经完成那样调用sorted就行了。然后,修复你的关键功能,使用小写的student参数,为了理智,你很高兴!