Динамические объекты в Python, как в AS3 - PullRequest
1 голос
/ 30 марта 2011

В AS3 у нас есть ключевое слово для определения динамических объектов:

dynamic class DynamicClass { ... }

Итак, мы можем добавлять или удалять свойства во время выполнения.

var dynamicInstance:DynamicClass = new DynamicClass();
// add a property like this...
dynamicInstance.newProperty = 'newValue';
// or this...
dynamicInstance['otherProperty'] = 'otherValue';

Я могу получить доступ или даже перебрать всю коллекцию динамических свойств:

for (var name:String in dynamicInstance)
    trace(name, '=', dynamicInstance[name])
// output:
//     newProperty = newValue
//     otherProperty = otherValue

И я также могу удалить эти свойства:

// and delete a property like this...
delete dynamicInstance.newProperty;
// or this...
delete dynamicInstance['otherProperty'];

Как это можно сделать в Python?

Ответы [ 2 ]

4 голосов
/ 30 марта 2011

все классы в Python являются динамическими. вы можете получить к ним доступ вот так

class a:
   pass

>>> a.name="rob"
>>> a.age=45
>>> dir(a)
['__class__', '__delattr__', '__dict__', '__doc__', '__eq__', '__format__', '__ge__',
 '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__',
 '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__',
 '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'age', 'name']

>>> a.age
45
>>> a.name
'rob'

или

>>> setattr(a,"job","fischer")
>>> getattr(a,"name")
'rob'

Если вы хотите изменить все экземпляры класса, вы можете легко написать цикл for, который игнорирует экземпляры, начинающиеся с __

1 голос
/ 30 марта 2011

Сотрудник дал мне совет по этому вопросу, и мы нашли решение для этого:

class Dynamic:
    def __getitem__(self, name):
        return getattr(self, name)

    def __setitem__(self, name, value):
        setattr(self, name, value)

    def __delitem__(self, name):
        delattr(self, name)

    def __iter__(self):
        return self.__dict__.__iter__()

Вот тест:

dynamicInstance = Dynamic()
dynamicInstance.newProperty = 'newValue'
dynamicInstance['otherProperty'] = 'otherValue'

print [(name, dynamicInstance[name]) for name in dynamicInstance]

del dynamicInstance['newProperty']

print [(name, dynamicInstance[name]) for name in dynamicInstance]

del dynamicInstance.otherProperty

print [(name, dynamicInstance[name]) for name in dynamicInstance]

#output:
# [('otherProperty', 'otherValue'), ('newProperty', 'newValue')]
# [('otherProperty', 'otherValue')]
# []
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...