我经常发现自己创建了同质的对象集,我通常将它们存储在字典或列表字典中。
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}
- 将前两个需求串在一起
起初,这似乎表明我应该使用数据库。但是,我将不得不放弃使用任意对象作为元素所提供的自由。
我喜欢为这种类型的结构创建一个类(如果它不存在的话),它可以满足这些需求,比如......
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__
我在这里创建了一个类的方法