【问题标题】:how to avoid staticmethod in my Python sample如何在我的 Python 示例中避免使用静态方法
【发布时间】:2015-04-19 05:55:41
【问题描述】:

我想将 Student 类的排序实例存储到 Student 类中。我在学生类中使用静态方法进行排序。我可能是错的,但是设计似乎有点难看,并且想避免使用静态方法(我认为最理想的方法是在学生类中使用返回学生ID的类方法,并使用此方法进行排序,但似乎在Student类中设置类Student的类方法进行排序不是更简单的方法),如果有更好的设计,请分享,

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

提前致谢, 林

【问题讨论】:

  • 我不懂你的代码设计——你为什么要为 Student 类中的 Student.id 字段创建一个 getter? getStudentID 方法是多余的
  • @mittelmania,好点,我可以,但是如何在学生类中引用此方法进行排序?谢谢。

标签: python class static-methods


【解决方案1】:

使用operator.attrgetter

import operator
...

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

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

【讨论】:

    【解决方案2】:

    您可以改用lambda expression

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

    您是想这样做还是让您的 Student 类本身具有可比性(请参阅 tzaman 的回答)取决于您的其余代码和您的意图。如果您需要在其他地方订购学生,请将订购包括在Student 类中。如果您只想在 Students 类中订购它们,请使用我的方法。

    从 OOP 设计的角度来看,我一般不会认为学生是按顺序排列的,但这由您决定(最终可能是为了方便起见)。

    【讨论】:

      【解决方案3】:

      如果您的目标只是基于 idsort 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()
      

      【讨论】:

        猜你喜欢
        • 2014-12-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多