同类对象集的Python类

我经常发现自己创建了同类对象,通常将它们存储在字典或字典列表中。

   a,b,c = MyClass(...), MyClass(...), MyClass(...)
   my_set = {'a':a,'b':b,'c':c}

在这样的背景下,共同的需求是

  • 从对象的属性或方法返回同类集

    • {k:k.prop for k in my_set} , 或者

    • {k:k.func() for k in my_set}

  • 根据属性或对象方法的输出进行过滤

    • {k:k.prop for k in my_set if k.prop is blah} , 或者

    • {k:k.func() for k in my_set if k.func() is blah}

  • 将前两个需求放在一起

起初,这似乎表明我应该使用数据库。但是,我将不得不放弃使用任意对象作为元素所提供的自由。

id喜欢为此类型的结构创建一个类(如果尚不存在),则可以通过以下方式满足这些需求:

a,b,c = MyClass(...), MyClass(...), MyClass(...)

   my_set = {'a':a,'b':b,'c':c}

   my_set.prop # fufills first need

   my_set.func() # fufills first need

   my_set[prop = blah] # fufills second need

   my_set[prop= blah].prop.func() # third need

是否存在这样的功能?还是对这个对象的需求是不良设计的结果?


桃花长相依
浏览 160回答 4
4回答

12345678_0001

您正在寻找类的特殊方法。看看 __getattr__和__getitem__。您可以编写自己的课程。它的这一类的实例可以有 a,b并c作为属性,可以做你的描述。这样的事情可能会做部分您想做的事情:class DictCollcetion(object):    def __init__(self, dict_):        self.dict = dict_    def __getattr__(self, name):        return {k: k.name for k in self.dict}    def __getitem__(self, key):        return {k: k.key for k in self.dict}

守候你守候我

您是否考虑过仅使用集合?my_set = {myclass(...),myclass(...),myclass(...)}props = {k.prop for k in my_set}虽然您可以创建一个为您完成映射的类,但对我而言,这并不比坚持使用标准映射结构更清楚您的代码。

肥皂起泡泡

我遇到过像我一样操纵大量字典或对象的情况。通常,这些对象会从数据库中提取出来,并通过ORM进行填充,但我也使用CSV文件来完成。我不确定我的需求是否足够频繁/常见,我是否会寻找一个模块来为其提供语法糖。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python