python - 在 Python 中创建一组命名对象的最佳方法
问题描述
我发现自己经常创建一组命名对象,其中每个对象都有一个唯一的名称。我将这些实现为dict
s,其密钥来自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 方式来做到这一点?
解决方案
标准库中没有更通用的支持,没有,也没有比使用字典更“Pythonic”的方法来实现这一点。
您正在做的是提供一个查找表 index,并且索引通常需要一些重复的数据。您正在用内存换取访问速度。但是索引是特定于用例的,要么通过映射简单地实现,要么对应用程序过于具体,无法推广到将其添加到语言库有意义的级别。
至少在 Python 中,名称的字符串值实际上并没有重复;您只需添加更多引用即可;一次来自实例,另一次来自ITEMS
字典。
推荐阅读
- flask - BuildError:无法为端点“main.index”构建 url。你的意思是“索引”吗?
- powerbi - Power BI - 不支持所有页面上的筛选器
- informix - Informix IDS:DB_LOCALE 与 GL_COLLATE、GL_CTYPE
- sql-server - 如何对除主键以外的其他内容求和?
- python - 使用 sklearn.utils.shuffle 编译 python 代码时出错
- c# - Selenium - 更改页面加载
- java - Java:运行控制台命令并保持控制台运行以获取更多控制台命令
- python - 如何从 Anaconda 导入 Python 包
- javascript - Array.prototype.some() 异步
- android - Android FirebaseUI:用另一个谷歌账户登录很麻烦