用于同类对象集的Python类

时间:2013-06-05 18:15:00

标签: 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

这样的功能存在吗?或者这个对象是否需要设计不良?

解决方案

根据@ mike-muller建议覆盖__getattr__方法,我在这里创建了一个类

https://gist.github.com/arsenovic/5723000

4 个答案:

答案 0 :(得分:1)

您正在寻找特殊的类方法。看看__getattr____getitem__。你可以自己编写课程。它的这个类的实例可以有abc作为属性,可以做你所描述的。

这样的事情可能会影响你喜欢做的事情:

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}

答案 1 :(得分:0)

我遇到过像我一样操纵大字典或对象列表的情况。通常这些对象被从数据库中拉出并通过ORM填充,但我也使用了CSV文件。

我不确定我的需求是否经常/常见,以至于我会寻找一个模块来为它提供语法糖。

答案 2 :(得分:0)

您是否考虑过只使用套装?

my_set = {myclass(...),myclass(...),myclass(...)}
props = {k.prop for k in my_set}

虽然您可以创建一个为您执行该映射的类,但对我来说这并不明显,这使得您的代码比使用标准映射构造更清晰。

答案 3 :(得分:-1)

根据@ mike-muller建议覆盖_getattr__方法,我在这里创建了一个类

https://gist.github.com/arsenovic/5723000