【问题标题】:Sorting a list of inherited class instances by a class attribute dictionary Key按类属性字典键对继承的类实例列表进行排序
【发布时间】:2017-05-03 20:12:10
【问题描述】:

是否可以编写一个基类方法来对类对象列表进行排序,存储为静态类变量,在子类中,通过字典中的键,即使用 sort 或 sorted 的类的属性还是需要写更精细的排序方法?

我是一个 python 菜鸟,我尝试使用 sort & sorted 编写“my_sorter”方法,尝试使用 lambda 键定义、itemgetter 和 attrgetter,但不确定我是否在访问语法上失败这些混合的嵌套结构,或者如果不编写更复杂的排序例程来故意在列表中移动条目是不可能的。

请注意,每个子类都有一个名为“mindex”的静态变量,用于标识其属性字典的“主键”(即排序依据的唯一值)。 my_sorter() 方法会是什么样子?

class Engine():
    storage = []

    @classmethod
    def my_sorter(cls):
        #sort cls.storage by cls.mindex

class Person(Engine):
    mindex = 'Name'

    def __init__(self, name):
        self.attributes = {
            'Name' : name,
        }

class Meeting (Engine):
    mindex = 'Date'

    def __init__(self, date):
        self.attributes = {
            'Date' : date,
        }

【问题讨论】:

  • 是否可以编写一个基类方法来对类对象列表进行排序,存储为静态类变量,在子类中,通过字典中的键,即使用 sort 或 sorted 的类的属性,还是需要编写更复杂的排序方法? 再次请:O ?!
  • 您能否提供一个示例,说明您希望这种方法能做什么?
  • PersonMeeting 将以这种方式共享同一个 storage 列表。这真的是你想要发生的事情吗? (您可能根本不应该将 storage 设为类属性;它是可变的全局状态,可能不是这些类的任何责任。另外,您有花引号。这会导致问题。)

标签: python class sorting class-method


【解决方案1】:

您没有在任何地方显示您的对象如何在 storage 列表中结束,但假设您的工作正常(并且您没有意外地在 Engine.storage 中获得不同子类的对象的混合) ,排序应该很简单。

@classmethod
def my_sorter(cls):
    return sorted(cls.storage, key=lambda obj: obj.attributes[cls.mindex])

我有点怀疑你的PersonMeeting 类是否应该是Engine 的子类。对我来说,这似乎不是一种 IS-A 关系。如果我知道整个项目的设计,也许会更有意义。

【讨论】:

    猜你喜欢
    • 2012-10-12
    • 1970-01-01
    • 2021-03-29
    • 1970-01-01
    • 2014-02-11
    • 2019-01-25
    • 2018-07-03
    • 2015-09-14
    • 1970-01-01
    相关资源
    最近更新 更多