首页 > 解决方案 > 在 Python 中创建一组命名对象的最佳方法

问题描述

我发现自己经常创建一组命名对象,其中每个对象都有一个唯一的名称。我将这些实现为dicts,其密钥来自myObject.name. 但是,将名称保留在两个地方感觉有点笨拙。

我的典型方法如下所示:

class NamedObject(object):
    ITEMS = {}

    def __init__(self, name, ...other arguments...):
        self.name = name
        ...more initialization...

    @classmethod
    def create_named_object(cls, name, ...other arguments...):
        obj = cls(name, ...other arguments...)
        cls.ITEMS[name] = obj

    @classmethod
    def find_object_by_name(cls, name):
        return cls.ITEMS.get(name, None)

    @classmethod
    def filter_objects(cls, predicate):
        return [e for e in cls.ITEMS.values() if predicate(e)]

我知道我可以创建一个通用类来处理这个问题,但是有没有更自然的 Pythonic 方式来做到这一点?

标签: python

解决方案


标准库中没有更通用的支持,没有,也没有比使用字典更“Pythonic”的方法来实现这一点。

您正在做的是提供一个查找表 index,并且索引通常需要一些重复的数据。您正在用内存换取访问速度。但是索引是特定于用例的,要么通过映射简单地实现,要么对应用程序过于具体,无法推广到将其添加到语言库有意义的级别。

至少在 Python 中,名称的字符串值实际上并没有重复;您只需添加更多引用即可;一次来自实例,另一次来自ITEMS字典。


推荐阅读