2013-12-12 2 views
1

Я новичок в python, и я читал документацию на python, и в данном примере на http://docs.python.org/2/howto/sorting.html#key-functions я застрял, и я не понимаю, как он работает.Python Class не работает с отсортированной функцией

Я использую затмение 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' 

Как класс и метод работает в питона ?? Почему этот код не работает?

EDIT

Но я changein последнюю строку и заменить данной линии

не
print sorted(Student.student_object, key=lambda student: student[0]) 

он работает и дает мне выход [('as', 'C', 12), ('dave', 'B', 10), ('john', 'a', 15)]

+3

Вы смешали примеры из документов; перечитайте их более тщательно. 'student_tuples' полностью отделен от примера на основе класса. – jonrsharpe

ответ

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) 
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) 

Примечание: Не называйте переменные с начальными прописными буквами.

+0

Но есть поле возраст ??? 'self.age = age' – KumarDharm

+0

@KumarDharm Но вы пытаетесь отсортировать только' student_object', правильно? – thefourtheye

+1

+1 для раздела * примечания * - Важный совет, поскольку это стандартная практика, определенная в PEP –

1

Вашего Student.student_object просто

student_object = [ 
       ('john', 'a', 15), 
       ('as', 'C', 12), 
       ('dave', 'B', 10) 
       ] 

и не имеет ничего общего с классом Student, за исключением того, что «внутри» его. вместо, так как каждый элемент массива является экземпляром класса 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) 

бы возраст атр.

1

Классы определяют структуру и поведение объектов, например, экземпляров. Когда вы определяете класс, Student, как и здесь, Python создает функцию Student(), называемую инициализатором, которую вы можете использовать для создания экземпляров этого класса. Поскольку вы предоставили метод Student для __init__, Python организует вызов этого как реализацию инициализатора.

Итак, чтобы создать объект Student, вам нужно будет вызвать инициализатор Студента с аргументами, указанными вашим методом __init__. Например: Student('john', 'A', 15).

Ваша ключевая функция (т. Е. Анонимная функция, созданная с помощью выражения lambda), ожидает получить что-то с свойством age. Предположительно, это должен быть объект, который является экземпляром класса Student. Однако:

  1. Именование параметра Student просто неверно. Студент не относится к классу здесь; он точно так же, как и любой другой параметр функции, и просто дает имя аргументу, который вы будете получать в этой функции. Обратите внимание, что в отличие от некоторых языков вам не нужно упоминать имя типа и имя переменной при объявлении параметра в Python; вы просто объявляете имя переменной и начинаете ее использовать. Также обратите внимание, что очень плохой стиль Python для обозначения переменных, начинающихся с заглавных букв, по этой причине: он смущает людей относительно переменных, классов и т. Д.
  2. Объекты, фактически передаваемые вашей ключевой функции, а не учеников. Поскольку вы вызываете sorted() в список кортежей, элементы, получаемые вашей функцией, являются кортежами, которые вы можете представить как экземпляры встроенного типа tuple, который предоставляет Python.

Итак, сначала сосредоточьтесь на получении списка учеников и понимании того, как работают объекты создания. Как только вы это сделаете, вызов sorted на нем, как вы это сделали, будет работать. Затем исправьте свою ключевую функцию, чтобы использовать параметр нижнего регистра student для здравого смысла, и вам хорошо идти!

Смежные вопросы