【问题标题】:How to extract string values into object fields如何将字符串值提取到对象字段中
【发布时间】:2023-04-04 01:25:01
【问题描述】:

我有这本词典:

{"id":3,"name":"MySQL","description":"MySQL Database Server - Fedora 21 - medium","image":"","flavor":""}

我有这个对象:

class Record():
    id = None
    name = None
    description = None
    image = None
    flavor = None

如何将字典中的值分配给它们对应的类字段?

【问题讨论】:

  • 这些变量应该是类变量还是实例变量?

标签: python


【解决方案1】:

以一个dict对象作为init函数的参数:

class Record(object):
  def __init__(self,record_dict):
    try:
      self.id = record_dict['id']
      self.name = record_dict['name']
      self.description = record_dict['description']
      self.image = record_dict['image']
      self.flavor = record_dict['flavor']
    except KeyError:
      print 'KeyError'

  def get_name(self):
    return self.name

adict = {"id":3,"name":"MySQL","description":"MySQL Database Server - Fedora 21 - medium","image":"","flavor":""}

one_obj = Record(adict)

print one_obj
print one_obj.get_name()

输出:

<__main__.Record object at 0x022E4C90>
MySQL

为我工作...

【讨论】:

  • 我按照上面的方法做了,但是得到了:record = Record() TypeError: __init__() 正好需要 2 个参数(1 个给定)
  • 当然,你忘了传递dict作为参数。
  • 我不知道我做错了什么。这正是我所说的: one_obj = Record(adict) ,我仍然得到 TypeError: __init__() 恰好需要 2 个参数(1 个给定)
  • 你的 Python 版本是多少?
  • 我必须使用 2.7.6 - 因为我正在扩展 OpenStack Horizo​​n,这就是他们使用的
【解决方案2】:

你可能想要这样的东西:

class Record:
def __init__(self, myDict):
    self.id = myDict[“id”]
    self.name = myDict[“name”]
    self.description = myDict[“description”]
    self.image = myDict[“image”]
    self.flavor = myDict[“flavor”]

并称它为:

rec = Record(myDict)

请参阅here 以了解类变量和实例变量之间的区别。

长话短说,类变量对于类的每个实例都有一个值,而实例变量的值对于每个实例都是唯一的。

类变量的定义如下:

class myClass:
    Classvar =  ‘something’

实例变量的定义如下:

class myClass:
    def __init__():
        Self.instanceVar = ‘something else’ 

【讨论】:

  • 我想 - 实例变量
【解决方案3】:

这里已经回答了: Convert Python dict to object?

我最喜欢的方法是这个:x.__dict__.update(d)

【讨论】:

    【解决方案4】:

    假设您的字典名称是input,您可以按如下方式分配它们

    id = input['id']
    name = input['name']
    description = input['description']
    image = input['image']
    flavor = input['flavor']
    

    【讨论】:

      【解决方案5】:

      试试这个获取对象属性的方法:

      r = Record()
      attributes = [i for i in dir(r) if not i.startswith('_')]
      

      基本上,有一堆背景属性包含一堆下划线。 dir 方法获取所有属性,然后我们创建一个我们想要的属性列表。此时:

      # attributes = ['count', 'description', 'flavor', 'id', 'image', 'index', 'name']
      

      所以现在我们使用__setattr__来根据my_dict设置我们刚才抓取的属性

      for i in attributes:
          r.__setattr__(i, my_dict[i])
      

      查看代码在线运行here

      【讨论】:

      • Record 必须显式继承自 object 类。
      【解决方案6】:

      创建记录时,传入字典。然后将键映射到值。

      【讨论】:

        【解决方案7】:

        另一种简单的方法,见代码here

        r = Record()
        
        for k, v in my_dict.items():
            exec('r.' + k + '="' + str(v) + '"')
        

        【讨论】:

        • 你们怎么看?只需一个简单的exec 即可设置属性。
        猜你喜欢
        • 2023-03-06
        • 1970-01-01
        • 2015-08-26
        • 1970-01-01
        • 2023-01-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-22
        相关资源
        最近更新 更多