Подтвердить что ты не робот

Как динамически получить доступ к свойствам класса в Python?

Скажем, я создаю экземпляр класса и хочу присвоить некоторые значения его общедоступным свойствам. Обычно это делается следующим образом:

class MyClass:
    def __init__(self):
        self.name = None
        self.text = None

myclass = MyClass()
myclass.name = 'My name'

Но что, если написать функцию, которая принимает класс как параметр, и я хотел бы присвоить некоторые значения общедоступным свойствам этого класса динамически - то есть через переменные и циклы (не зная, сколько их есть или что они называются.)

Очевидным будет:

myclass = MyClass()
myclass['name'] = "My name"

Но это не работает.

Любые идеи?

4b9b3361

Ответ 1

setattr(my_class_instance, 'attr_name', attr_value)

Ответ 2

После чтения отклонено Синтаксис для доступа к динамическим атрибутам Я использую класс mixin, предоставляющий доступ к атрибутам объекта в стиле словаря:

class MyClass:
    def __init__(self):
        self.name = None
        self.text = None
    def __getitem__(self, name):
        return getattr(self, name)
    def __setitem__(self, name, value):
        return setattr(self, name, value)
    def __delitem__(self, name):
        return delattr(self, name)
    def __contains__(self, name):
        return hasattr(self, name)

Пока можно настроить атрибуты напрямую:

myclass = MyClass()
myclass.name = "foo"
myclass.text = "bar"

тогда можно установить их динамически:

for attr in ('name', 'text'):
    myclass[attr] = confirm(attr, default=myclass[attr])

Ответ 3

Использование dir с setattr должно выполнять задание

class MyClass:
  def __init__(self):
    self.name = None
    self.text = None

myclass = MyClass()
myclass.name = 'My name'

for prop in dir(myclass):
    print '%s:%s'%(prop,getattr(myclass,prop))

print

for prop in dir(myclass):
    if prop[:2]!='__' and prop[-2:]!='__':
        print prop[-2:]
        setattr(myclass,prop,"Foo Bar")

for prop in dir(myclass):
    print '%s:%s'%(prop,getattr(myclass,prop))    

Но будьте осторожны, потому что этот код также устанавливает свойства '__doc__', '__init__', '__module__' в "Foo Bar". Поэтому вам придется позаботиться о том, чтобы избежать определенных вещей, предоставленных вам dir (особенно те, которые начинаются и заканчиваются с __ двойными подчеркиваниями).