【问题标题】:How to create object attributes from dictionary key/values? [duplicate]如何从字典键/值创建对象属性? [复制]
【发布时间】:2017-05-30 10:48:21
【问题描述】:

我有一个包含一些必需参数及其值的 excel 文件,我正在尝试将它们输入到我的类实体的 __init__ 函数中。我知道下面必须依次将self.key 设置为每个值,但我应该“屏蔽”(?).key?:

class Customer:
    def __init__(self):
        for key, value in zip(excelDF.attribs, excelDF.values):
            if key!=None and value !=None:
                self.key= value

举一个我正在尝试的例子:

excelDF.attribs=['name','telephone']
excelDF.values=['Tom','01234-567890']
customer1=Customer()
print(customer1.name)
print(customer1.telephone)

给...

Tom
01234-567890

【问题讨论】:

  • 使用setattr()
  • @deepspace 下面的答案很好,这个代码的小注释:不要将= 和!= 用于像None 这样的单例对象,如果你需要这样的检查,请使用is某些原因

标签: python python-3.x dictionary


【解决方案1】:

你应该使用setattr:

class Customer:
    def __init__(self):
        for key, value in zip(excelDF.attribs, excelDF.values):
            if key is not None and value is not None:
                setattr(self, key, value)

如果一个键碰巧是一个无效的 Python 标识符,它只能通过 getattr 访问。

使用示例:

keys = ['a', 'b', 'c']
values = [1, 2, 3]

class Customer:
    def __init__(self):
        for key, value in zip(keys, values):
            if key is not None and value is not None:
                setattr(self, key, value)

cust = Customer()
print(cust.a, cust.b, cust.c)
# 1 2 3

【讨论】:

    【解决方案2】:

    另一种使用类型定义类的不太常规的方法:

    Customer = type("Customer",
                    (),
                    dict(zip(excelDF.attribs, excelDF.values)))
    

    参考:http://python-course.eu/python3_classes_and_type.php

    【讨论】:

    • 正确,但是如果 OP 想在 Customer 类中定义一些方法,这将变得非常混乱。
    【解决方案3】:

    我想提出 2 个备选方案:

    #!/usr/bin/env python3
    
    
    class Customer:
        def __init__(self, **kwargs):
            self.name = kwargs.get("name")
            self.number = kwargs.get("number")
    
    
    class Customer2:
        name = ""
        number = ""
    
        @classmethod
        def from_dict(cls, d):
            o = cls()
            for k in [k for k in vars(cls) if not k.startswith("_")]:
                setattr(o, k, d.get(k))
            return o
    
    
    keys = ["name", "number", "bla"]
    values = ["John", "00109563221", "Blub"]
    
    data = {k: v for k, v in zip(keys, values)}
    c1 = Customer(**data)
    c2 = Customer2.from_dict(data)
    
    print(c1.name)
    print(c2.number)
    

    这里的压力在于构造函数拉它需要的数据,而不是获取所有的数据。

    Cave:Solution2 依赖于这样一个事实,即您只需要哑数据对象,其中您感兴趣的唯一字段是已定义的类变量。

    【讨论】:

      猜你喜欢
      • 2016-05-14
      • 2021-12-05
      • 2016-11-04
      • 1970-01-01
      • 1970-01-01
      • 2021-11-26
      • 2020-01-03
      相关资源
      最近更新 更多