Как создать свойства во время выполнения с Python? - PullRequest
1 голос
/ 30 июня 2011

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

  1. Создать подкласс свойства, включающий метаданные, необходимые для извлечения дополнительной информации из интерфейса
  2. Рефакторинг существующих объектов данных для использования нового подкласса свойства для соответствующихполя в пользовательском интерфейсе
  3. Создайте новый класс генератора, который принимает объект драйвера пользовательского интерфейса и объект данных, который
    • отражает объект данных, чтобы получить список всех его членов, которые являютсяновый тип подкласса свойств
    • сохраняет информацию из пользовательского интерфейса на основе метаданных в подклассе свойств для членов экземпляра класса генератора (при планировании использования setattr)
    • создает свойства во время выполнениясделать членов, созданных в (b), доступными только для чтения, и обеспечить интерфейс, совместимый с существующим кодом (т. е. используя .[name] вместо .[name]())

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

1 Ответ

0 голосов
/ 30 июня 2011

Не уверен, что это то, что вы хотите. Но вы можете определить динамическое свойство только для чтения с помощью метода 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
...