我经常发现自己创建了同类的对象集,我通常将其存储在字典或列表字典中。
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__
方法,我在这里创建了一个类
答案 0 :(得分:1)
您正在寻找特殊的类方法。看看__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}
答案 1 :(得分:0)
我遇到过像我一样操纵大字典或对象列表的情况。通常这些对象被从数据库中拉出并通过ORM填充,但我也使用了CSV文件。
我不确定我的需求是否经常/常见,以至于我会寻找一个模块来为它提供语法糖。
答案 2 :(得分:0)
您是否考虑过只使用套装?
my_set = {myclass(...),myclass(...),myclass(...)}
props = {k.prop for k in my_set}
虽然您可以创建一个为您执行该映射的类,但对我来说这并不明显,这使得您的代码比使用标准映射构造更清晰。
答案 3 :(得分:-1)
根据@ mike-muller建议覆盖_getattr__
方法,我在这里创建了一个类