【问题标题】:Represent a class as a dict or list将类表示为字典或列表
【发布时间】:2013-04-18 22:15:36
【问题描述】:

我有用于从一个系统获取数据、进行一些修改然后将它们输出到另一个系统的类。在我完成所有必要的转换之后,通常会将其转换为 dictlist

到目前为止,我已经完成了两种方法,称为as_dict()as_list(),并在我需要该表示时使用它。

但我很好奇是否有办法做到dict(instance_of_my_class)list(instance_of_my_class)

我一直在阅读magic methods,似乎这是不可能的?

还有一些简单的示例代码可以使用:

class Cost(object):
    @property
    def a_metric(self):
        return self.raw_data.get('a_metric', 0) * 0.8

    [..]
    # Repeat for various kinds of transformations

    def as_dict(self):
        return {
          'a_metric': self.a_metric,
          [...]
        }

【问题讨论】:

  • 为什么需要将类转换成字典/列表?每个类都有一个内置的dict,这是类属性在内部存储的地方,也许只存储它就足够了。
  • 内置了vars(),与obj.__dict__基本相同。
  • @theAlse 主要用于将其转换为数据库中的更新或简单转换为 json

标签: python structure idioms


【解决方案1】:

你的意思是这样的吗?如果是这样,您必须定义一个产生键值对的__iter__ 方法:

In [1]: class A(object):
   ...:     def __init__(self):
   ...:        self.pairs = ((1,2),(2,3))
   ...:     def __iter__(self):
   ...:         return iter(self.pairs)
   ...:     

In [2]: a = A()

In [3]: dict(a)
Out[3]: {1: 2, 2: 3}

另外,dict 似乎尝试在__iter__ 之前调用.keys / __getitem__ 方法,因此您可以使list(instance)dict(instance) 返回完全不同的东西。

In [4]: class B(object):
    ...:     def __init__(self):
    ...:        self.d = {'key':'value'}
    ...:        self.l = [1,2,3,4]
    ...:     def keys(self):
    ...:         return self.d.keys()
    ...:     def __getitem__(self, item):
    ...:         return self.d[item]
    ...:     def __iter__(self):        
    ...:         return iter(self.l)
    ...:     

In [5]: b = B()

In [6]: list(b)
Out[6]: [1, 2, 3, 4]

In [7]: dict(b)
Out[7]: {'key': 'value'}

【讨论】:

  • @gaqzi -- 似乎dict 在调用__iter__ 之前尝试调用.keys,因此如果需要,您可以使list(instance)dict(instance) 返回完全不同的东西:)
  • 太棒了! :D 谢谢你。我正在开发一个不同数据库库(类)的结构,它继承自一个抽象类数据库,它接收用于配置和身份验证的映射。
猜你喜欢
  • 2022-11-04
  • 2018-07-03
  • 1970-01-01
  • 2010-12-19
  • 2017-04-23
  • 2021-10-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多