2011-03-30 4 views
1

En AS3 nous avons un mot-clé pour définir des objets dynamiques:objets dynamiques en Python comme dans AS3

dynamic class DynamicClass { ... } 

Ainsi, nous pouvons ajouter ou supprimer des propriétés en exécution.

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

Le Je peux plus accéder ou même itérer throught toute la collection de propriétés dynamiques:

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

Et je peux aussi supprimer ces propriétés:

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

Comment cela peut-il être fait Python?

Répondre

1

Un collègue m'a donné un conseil à ce sujet et nous avons trouvé une solution pour cela:

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__() 

Voici un test:

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')] 
# [] 
4

Toutes les classes en python sont dynamiques. vous pouvez les acces comme celui-ci

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' 

ou

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

Si vous voulez changer toutes les instances de la classe, vous pouvez facilement écrire une boucle qui ignors les instances commençant par __

+0

Mais je veux travailler avec les instances, et non avec des classes –

+1

Cela ne résout pas le problème !!! Je ne peux pas créer une instance et accéder à une propriété comme celle-ci: 'instance ['property']'. Et en ajoutant des propriétés à une classe, toutes les instances les ont, je ne veux pas ça! –