如何在我的 Python 示例中避免静态方法
how to avoid staticmethod in my Python sample
我想将 Student class 的已排序实例存储到 Students class 中。我在 Students class 中使用 staticmethod 进行排序。我可能是错的,但设计似乎有点难看,想避免使用静态方法(在我看来最理想的方法是在 class Student which returns student 中使用 class 方法ID,并使用这种方法进行排序,但是在class学生中设置一个class学生的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()
提前致谢,
林
您可以使用 lambda expression 代替:
class Students:
def __init__(self, students):
self.sortedStudents = sorted(students, key=lambda s: s.id)
...
你是想这样做还是让你的 Student
class 本身具有可比性(参见 tzaman 的回答),这在一定程度上取决于你的代码的其余部分和你的意图。如果您需要对其他地方的学生进行排序,请将排序包含在 Student
class 中。如果您只想在 Students
class 内订购它们,请使用我的方法。
从 OOP 设计的角度来看,我一般不会认为 students 是有序的,但这由你决定(最终可能是为了方便)。
import operator
...
def __init__(self, students):
self.sortedStudents = sorted(students, key=operator.attrgetter('id'))
operator.attrgetter('id')
returns 来自操作数的 returns 属性 id
的可调用对象。所以它可以用来代替静态方法或 lambda
.
如果您的 objective 只是基于它的 id
sort Student's instance
,您不需要其他函数或方法。您可以使用 lambda 表达式实现此目的。
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 class 的已排序实例存储到 Students class 中。我在 Students class 中使用 staticmethod 进行排序。我可能是错的,但设计似乎有点难看,想避免使用静态方法(在我看来最理想的方法是在 class Student which returns student 中使用 class 方法ID,并使用这种方法进行排序,但是在class学生中设置一个class学生的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()
提前致谢, 林
您可以使用 lambda expression 代替:
class Students:
def __init__(self, students):
self.sortedStudents = sorted(students, key=lambda s: s.id)
...
你是想这样做还是让你的 Student
class 本身具有可比性(参见 tzaman 的回答),这在一定程度上取决于你的代码的其余部分和你的意图。如果您需要对其他地方的学生进行排序,请将排序包含在 Student
class 中。如果您只想在 Students
class 内订购它们,请使用我的方法。
从 OOP 设计的角度来看,我一般不会认为 students 是有序的,但这由你决定(最终可能是为了方便)。
import operator
...
def __init__(self, students):
self.sortedStudents = sorted(students, key=operator.attrgetter('id'))
operator.attrgetter('id')
returns 来自操作数的 returns 属性 id
的可调用对象。所以它可以用来代替静态方法或 lambda
.
如果您的 objective 只是基于它的 id
sort Student's instance
,您不需要其他函数或方法。您可以使用 lambda 表达式实现此目的。
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()