为了账号安全,请及时绑定邮箱和手机立即绑定

同类对象集的Python类

同类对象集的Python类

桃花长相依 2021-03-24 17:14:58
我经常发现自己创建了同类对象,通常将它们存储在字典或字典列表中。   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}


查看完整回答
反对 回复 2021-03-30
?
守候你守候我

TA贡献1802条经验 获得超10个赞

您是否考虑过仅使用集合?


my_set = {myclass(...),myclass(...),myclass(...)}

props = {k.prop for k in my_set}

虽然您可以创建一个为您完成映射的类,但对我而言,这并不比坚持使用标准映射结构更清楚您的代码。


查看完整回答
反对 回复 2021-03-30
?
肥皂起泡泡

TA贡献1829条经验 获得超6个赞

我遇到过像我一样操纵大量字典或对象的情况。通常,这些对象会从数据库中提取出来,并通过ORM进行填充,但我也使用CSV文件来完成。

我不确定我的需求是否足够频繁/常见,我是否会寻找一个模块来为其提供语法糖。


查看完整回答
反对 回复 2021-03-30
  • 4 回答
  • 0 关注
  • 159 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信