我经常发现自己创建了同类对象,通常将它们存储在字典或字典列表中。 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是否存在这样的功能?还是对这个对象的需求是不良设计的结果?
4 回答
12345678_0001
TA贡献1802条经验 获得超5个赞
您正在寻找类的特殊方法。看看 __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}
守候你守候我
TA贡献1802条经验 获得超10个赞
您是否考虑过仅使用集合?
my_set = {myclass(...),myclass(...),myclass(...)}
props = {k.prop for k in my_set}
虽然您可以创建一个为您完成映射的类,但对我而言,这并不比坚持使用标准映射结构更清楚您的代码。
肥皂起泡泡
TA贡献1829条经验 获得超6个赞
我遇到过像我一样操纵大量字典或对象的情况。通常,这些对象会从数据库中提取出来,并通过ORM进行填充,但我也使用CSV文件来完成。
我不确定我的需求是否足够频繁/常见,我是否会寻找一个模块来为其提供语法糖。
添加回答
举报
0/150
提交
取消