2009-06-01 8 views
3

J'utilise boto pour gérer des instances EC2. Il fournit une classe Instance. Je voudrais le sous-classer pour répondre à mes besoins particuliers. Puisque boto fournit une interface de requête pour obtenir vos instances, j'ai besoin de quelque chose à convertir entre les classes. Cette solution semble fonctionner, mais changer l'attribut de classe semble douteux. Y a-t-il un meilleur moyen?Diffuser une instance de classe dans une sous-classe

from boto.ec2.instance import Instance as _Instance 

class Instance(_Instance): 
    @classmethod 
    def from_instance(cls, instance): 
     instance.__class__ = cls 
     # set other attributes that this subclass cares about 
     return instance 

Répondre

7

Je ne voudrais pas sous-classer et cast. Je ne pense pas que le casting soit toujours une bonne politique.

Au lieu de cela, envisagez un emballage ou une façade.

class MyThing(object): 
    def __init__(self, theInstance): 
     self.ec2_instance = theInstance 

Maintenant, vous pouvez sous-classe MyThing autant que vous voulez et vous ne devriez pas avoir à jeter votre boto.ec2.instance.Instance du tout. Il reste comme un élément plus ou moins opaque dans votre objet.

+0

+1 Composition sur l'héritage lorsque cela est possible. –

+0

La classe que je voudrais sous-classer est beaucoup plus complexe que les ajouts que je fais (vraiment juste quelques attributs). Pour exposer toutes les fonctionnalités de la classe enveloppée, j'aurais besoin de beaucoup de fonctions/propriétés enveloppées. Je comprends la question de la composition v. De l'héritage, mais aller sur la route de la composition semble être plus ennuyeux que ça en vaut la peine dans ce cas. – iconoplast

+1

@iconoplast: "J'aurais besoin de beaucoup de fonctions/propriétés enveloppées". Pourquoi? L'instance est toujours appelée 'myThing.ec2_instance'. Pourquoi ne pouvez-vous pas appeler directement les propriétés et les méthodes de l'instance EC2? Quoi d'autre se passe-t-il? –

Questions connexes