Переопределить переменные класса в цикле - PullRequest
0 голосов
/ 07 октября 2019

Предполагая, что у меня есть класс, который определен с переменными следующим образом:

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.name, Obj.dS или Obj.type

Ответы [ 3 ]

4 голосов
/ 07 октября 2019

Почему бы не сделать функцию инициализации, которая принимает значения?

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

Затем используйте:

DataShell(**L)

Или еще проще в Python 3 использовать dataclass

import dataclass 

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

Obj = DataShell(**L)
3 голосов
/ 07 октября 2019

Вы можете использовать setattr и hasattr. Например:

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
1 голос
/ 07 октября 2019

Код, который вы скопировали в вопросе, вообще не работает. Я пытался изменить ваш код, и теперь он работает -

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 для динамической установки атрибутов класса

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...