重写循环中的类变量

2024-10-03 15:28:02 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有一个用变量定义的类,如下所示:

import numpy as np
class DataShell:
    dS=''
    name=''
    type=''
    some other variables

我初始化一个对象

Obj=DataShell()

我有一个字典L,我想把字典中的值赋给对象的类变量

{'name': 'abc', 'type': 'def', 'dS': 'hij'}

我正在尝试使用以下代码来执行此操作:

attributes = [attr for attr in dir(Obj) 
              if not attr.startswith('__')]
for key in L:
    for el in attributes:
        if key==el:
            Obj.el=str(L[key])

这是在我的对象中创建一个名为'el'的新变量,并为其赋值,而不是更改我的Obj.nameObj.dSObj.type


Tags: 对象keynameinobjforif字典
3条回答

你在问题中复制的代码根本不起作用。我试着修改你的代码,现在可以了-

class DataShell:
    dS=''
    name=''
    type=''

Obj=DataShell()
print(id(Obj))
L = {'name': 'abc', 'type': 'def', 'dS': 'hij'}
attributes = [attr for attr in dir(Obj) 
              if not attr.startswith('__')]
print(attributes)
for key in L:
    for el in attributes:
        if key==el:
            if hasattr(Obj, el):
                setattr(Obj, el, L[key]) 

print(id(Obj))
print(dir(Obj))
print(Obj.dS)
print(Obj.name)
print(Obj.type)

使用setattr动态设置类属性

您可以使用setattrhasattr。例如:

class MyClass(object):
    attr1 = 1
    attr2 = 2

myobject = MyClass()

m = {'attr1': 19, 'some_other_name': 'blah'}
for name, value in m.items():
    if hasattr(myobject, name):
        setattr(myobject, name, value)

print(myobject.attr1)  # 19

为什么不做一个初始化函数来获取这些值呢

class DataShell:
    def __init__(self, dS='', name='', type=''):
        dS = dS
        name = name
        type = type

然后使用:

DataShell(**L)

或者在python3中更容易使用dataclass

import dataclass 

@dataclass
class DataShell:
    dS: str  = ''
    name: str  = ''
    type: str  = ''

Obj = DataShell(**L)

相关问题 更多 >