2009-06-01 7 views
3

Ich verwende boto, um einige EC2 Instanzen zu verwalten. Es bietet eine Instance-Klasse. Ich möchte es unterteilen, um meine speziellen Bedürfnisse zu erfüllen. Da Boto eine Abfrage-Schnittstelle bietet, um Ihre Instanzen zu erhalten, brauche ich etwas, um zwischen den Klassen zu konvertieren. Diese Lösung scheint zu funktionieren, aber das Ändern des Klassenattributs scheint zweifelhaft zu sein. Gibt es einen besseren Weg?Werfen Sie eine Klasseninstanz in eine Unterklasse

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 

Antwort

7

Ich würde nicht Unterklasse und Besetzung. Ich glaube nicht, dass Casting jemals eine gute Politik ist.

Betrachten Sie stattdessen einen Wrapper oder eine Fassade.

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

Jetzt können Sie MyThing so viel Unterklasse, wie Sie wollen, und Sie sollten nicht Ihre boto.ec2.instance.Instance überhaupt werden müssen Gießen. Es bleibt als mehr oder weniger undurchsichtiges Element in Ihrem Objekt.

+0

+1 Zusammensetzung über Vererbung, wenn möglich. –

+0

Die Klasse, die ich unterklassieren möchte, ist viel komplexer als die Additionen, die ich mache (wirklich nur ein paar Attribute). Um die gesamte Funktionalität in der umschlossenen Klasse verfügbar zu machen, würde ich eine Menge umgebender Funktionen/Eigenschaften benötigen. Ich verstehe die Zusammensetzung v. Vererbungsfrage, aber die Kompositionsroute scheint mehr Mühe zu machen, als es in diesem Fall wert ist. – iconoplast

+1

@iconoplast: "Ich würde viele eingepackte Funktionen/Eigenschaften benötigen". Warum? Die Instanz heißt immer "myThing.ec2_instance". Warum können Sie die Eigenschaften und Methoden der EC2-Instanz nicht direkt aufrufen? Was ist sonst noch los? –