从字典描述创建对象

时间:2015-11-12 13:54:41

标签: python mongodb pymongo

Python MongoDB驱动程序PyMongo将结果作为字典返回。我试图弄清楚在对象构造函数中使用这样一个字典的最佳方法。

  1. 将字典保存为属性

    self.dict = building_dict
    

    然后可以通过building.dict["property"]到达建筑物的每个属性。

    可以使用更好的属性名称。也许是一个字母的属性。这看起来不那么优雅。

  2. 解析字典以创建属性

    self.name = building_dict['name']
    self.construction_date = building_dict['construction_date']
    ...
    

    在我的模型中,字典可能非常大,但构造函数中的this task can be automated可以在赋值之前或之后对值执行操作/检查。

  3. 编辑:使用getter / setter独立于选项1.和2.上面。

    在解决方案2中,我通过在制作属性之前用下划线为所有字典键添加前缀来避免属性与其getter之间的名称冲突。

    作为一个副问题,字典可能包含嵌入文档的描述,因此构造函数应该遍历整个字典以查找在代码中具有其特定类的嵌入文档并立即实例化这些类。

    更新

    我很可能会为我的项目使用ODM,例如MongoEngine,它会处理这些问题。

    除了这个特定用例(与MongoDB链接,现有ODM,...)之外,问题仍然存在,所以我要留下我能提出的最佳答案

2 个答案:

答案 0 :(得分:1)

您可以做的最好的事情是创建object。您可以使用class实例化dict,如下所示:

building_dict = {'property': 4, 'name': 'my name'}   # example dict
my_item = type('MyClass', (), building_dict)         # instantiating class MyClass

您可以像之后的其他对象一样访问它:

print(my_item.property)
# 4
print(my_item.name)
# my name

答案 1 :(得分:0)

到目前为止,我最喜欢的解决方案是将元素存储为属性并使用getter / setter:

class Building(object):

    def __init__(self, dictionary):

        # Check the values
        # ...

        # Find sub-dictionaries describing instances of another class
        # stored as embedded documents in the base, call their 
        # constructor on sub-directories, then replace each sub-directory
        # with the corresponding class instance.
        # ...

        # Set attributes from dictionary
        for key in dictionary:
            setattr(self, '_'+key, dictionary[key])

        # Add default values if needed, etc.
        # ...

    # Usual getter/setter stuff
    @property
    def name(self):
        try:
            return self._name
        except AttributeError as e:
            # deal with missing name