Как создавать свойства во время выполнения с помощью Python?

Поэтому я пытаюсь выяснить, возможно ли то, что я хочу сделать. Я пишу тестовый код для приложения, и у меня есть объекты, содержащие свойства, представляющие некоторые элементы, которые есть в интерфейсе нашего продукта. Что я хочу сделать, так это иметь возможность передавать средство запуска приложения и объект данных в новый класс и динамически генерировать набор свойств доступа на основе подмножества свойств в объекте данных. Моя идея на данный момент:

  1. Создайте подкласс свойства, который включает метаданные, необходимые для извлечения дополнительной информации из интерфейса.
  2. Рефакторинг существующих объектов данных для использования нового подкласса свойств для соответствующих полей в пользовательском интерфейсе.
  3. Create a new generator class that accepts the UI driver object and the data object that
    • reflects the data object to get a list of all the members of it that are of the new property subclass type
    • сохраняет информацию из пользовательского интерфейса на основе метаданных в подклассе свойств для членов экземпляра класса генератора (планируется использование setattr)
    • создавать свойства во время выполнения, чтобы члены, созданные в (b), были доступны только для чтения и предоставляли интерфейс, совместимый с существующим кодом (т. е. используя .[name] вместо .[name]())

Я думаю, что все понял, кроме шага 3c. Есть ли способ динамически создавать свойства во время выполнения? Любая помощь будет принята с благодарностью.


person Silas Ray    schedule 30.06.2011    source источник


Ответы (1)


Не уверен, что ты этого хочешь. Но вы можете определить динамическое свойство только для чтения с помощью методов getattr и setattr. Вот пример:

class X(object):
    data = {'x' : 123, 'y' : 456}
    def __getattr__(self, name):
        if name in self.data:
            return self.data[name]
        raise AttributeError(name)

    def __setattr__(self, name, value):
        if name in self.data:
            return None
        return super(X, self).__setattr__(name, value)

a = X()
print a.x, a.y
a.x = 0
print a.x
person Ryan Ye    schedule 30.06.2011
comment
Думаю, я запутался глубже, чем думал... У меня проблемы с (1), и я думал, что у меня это получилось... - person Silas Ray; 01.07.2011