Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python示例中避免staticmethod_Python_Class_Static Methods - Fatal编程技术网

如何在Python示例中避免staticmethod

如何在Python示例中避免staticmethod,python,class,static-methods,Python,Class,Static Methods,我想将已排序的Student类实例存储到Students类中。我在学生课堂上使用静态方法进行排序。我可能错了,但设计似乎有点难看,希望避免使用静态方法(我心目中最理想的方法是在class Student中使用class方法返回学生ID,并使用此方法进行排序,但在class Student中设置class Student的class方法进行排序似乎不是一种更简单的方法),如果有更好的设计,如果你能和我分享 class Student: def __init__(self, id):

我想将已排序的Student类实例存储到Students类中。我在学生课堂上使用静态方法进行排序。我可能错了,但设计似乎有点难看,希望避免使用静态方法(我心目中最理想的方法是在class Student中使用class方法返回学生ID,并使用此方法进行排序,但在class Student中设置class Student的class方法进行排序似乎不是一种更简单的方法),如果有更好的设计,如果你能和我分享

class Student:
        def __init__(self, id):
                self.id = id

class Students:
        def __init__(self, students):
                self.sortedStudents = sorted(students, key=Students.getStudentID)
        @staticmethod
        def getStudentID(student):
                return student.id

        def dumpAllStudents(self):
                for student in self.sortedStudents:
                        print student.id

students = []
students.append(Student(100))
students.append(Student(90))
students.append(Student(80))

allStudents = Students(students)
allStudents.dumpAllStudents()
提前感谢,, Lin

您可以使用

你是想这样做,还是想让你的
学生
课程本身具有可比性(参见tzaman的答案),在一定程度上取决于你的代码的其余部分和你的意图。如果您需要其他地方的学生订单,请在
Student
课程中包含订单。如果你只想让他们在你的
学生
课堂上进行排序,请使用我的方法

从OOP设计的角度来看,我不认为学生一般是命令的,但这是由你来决定的(并且最终可能是一个方便的问题)。

< P>使用:


operator.attrgetter('id')
返回一个可调用函数,该函数从操作数返回属性
id
。因此,它可以代替静态方法或
lambda

如果您的目标只是根据学生实例的
id
对学生实例进行
排序,则不需要其他函数或方法。您可以使用表达式来实现这一点

class Student:
        def __init__(self, id):
                self.id = id

class Students:
        def __init__(self, students):
                self.sortedStudents = sorted(students, key=lambda stud: stud.id) 

        def dumpAllStudents(self):
                for student in self.sortedStudents:
                        print student.id

students = []
students.append(Student(100))
students.append(Student(90))
students.append(Student(80))

allStudents = Students(students)
allStudents.dumpAllStudents()

我不理解你的代码设计——为什么你要在学生类中为Student.id字段创建一个getter?getStudentID方法是redundant@mittelmania,很好,我可以,但如何在学生课堂上参考这种方法进行排序?谢谢
import operator
...

def __init__(self, students):
    self.sortedStudents = sorted(students, key=operator.attrgetter('id'))
class Student:
        def __init__(self, id):
                self.id = id

class Students:
        def __init__(self, students):
                self.sortedStudents = sorted(students, key=lambda stud: stud.id) 

        def dumpAllStudents(self):
                for student in self.sortedStudents:
                        print student.id

students = []
students.append(Student(100))
students.append(Student(90))
students.append(Student(80))

allStudents = Students(students)
allStudents.dumpAllStudents()