2011-05-11 4 views
2

Je voudrais pouvoir envelopper n'importe quel objet en Python. Ce qui suit ne semble pas possible, sauriez-vous pourquoi?Quelle est la meilleure façon pythonienne d'envelopper un objet?

class Wrapper: 
    def wrap(self, obj): 
     self = obj 

a = list() 
b = Wrapper().wrap(a) 
# can't do b.append 

Merci!

+2

Note complémentaire, si votre on python 2.x est considéré comme une bonne pratique pour hériter de l'objet –

+1

C'est parfaitement possible, mais cela ne fonctionne pas comme vous le pensez. :) Les variables Python ne sont pas des pointeurs, ce sont des noms. Lorsque vous définissez 'self = obj', vous dites simplement que le nom" self "pointe vers l'objet sur lequel le nom" obj "pointe également. Mais les noms sont locaux, ou il ne peut y avoir qu'un soi dans tout le programme, donc cela ne change rien. Et cela nous amène au commentaire suivant: Lorsque vous posez une question, expliquez toujours * pourquoi * vous faites ce que vous faites. Vous ne semblez pas vouloir envelopper l'objet, vous semblez vouloir le substituer. –

+2

Pourquoi "envelopper" un objet? Les objets en Python n'ont jamais besoin de wrappers, car ils sont toujours complètement "compatibles" les uns avec les autres. Pouvez-vous nous donner une idée de ce que vous entendez par «enveloppe»? Et pourquoi? –

Répondre

5

Essayez avec la magie python getattr:

class Wrapper: 
    def wrap(self, obj): 
     self.obj = obj 
    def __getattr__(self, name): 
     return getattr(self.obj, name) 

a = list() 
b = Wrapper() 
b.wrap(a) 

b.append(10) 
0

Vous faites référence à juste l'auto variable pour être un certain objet dans une pellicule(). Lorsque wrap() se termine, cette variable est récupérée.

Vous pouvez simplement enregistrer l'objet dans un attribut Wrapper pour obtenir ce que vous voulez

1

Vous pouvez aussi faire ce que vous voulez en redéfinissant nouvelle:

class Wrapper(object): 
    def __new__(cls, obj): 
     return obj 
t = Wrapper(list()) 
t.append(5) 
+0

Cette question pourrait aussi vous être utile: http://stackoverflow.com/questions/1015592/why-is-self-in-python-objects-immutable – Hernan

+0

Avec cette méthode, vous n'avez pas vraiment de liste déroulante, vous venez de fait un 'Wrapper' appelable non-op qui retourne simplement tout ce qui est passé. L'objet 't' _est un objet liste. (Si 'Wrapper' est passé une sous-classe' Wrapper' comme argument (disons que vous surchargez '__new__' pour que cela fonctionne correctement), alors il appellera aussi' __init__' sur l'objet qui lui est passé) –

1

Peut-être ce que vous cherchez, qui fait le travail que vous cherchez à faire, beaucoup plus élégamment que vous essayez de le faire, est:

Alex MartelliBunch Class.

class Bunch: 
    def __init__(self, **kwds): 
    self.__dict__.update(kwds) 

# that's it! Now, you can create a Bunch 
# whenever you want to group a few variables: 

point = Bunch(datum=y, squared=y*y, coord=x) 

# and of course you can read/write the named 
# attributes you just created, add others, del 
# some of them, etc, etc: 
if point.squared > threshold: 
    point.isok = 1 

D'autres implémentations sont disponibles dans la page de recette liée.

Questions connexes