2009-06-01 8 views
3

EC2インスタンスを管理するためにbotoを使用しています。これはInstanceクラスを提供します。私はそれを私の特別なニーズを満たすためにサブクラス化したいと思います。 botoはインスタンスを取得するためのクエリインタフェースを提供するので、クラス間で変換する必要があります。このソリューションはうまくいくようですが、クラス属性を変更するのは面倒なようです。より良い方法がありますか?クラスインスタンスをサブクラスにキャスト

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 

答えて

7

私はサブクラス化してキャストしません。私はキャスティングが今までのところ良い政策だとは思わない。

代わりに、ラッパーまたはファサードを考えてみましょう。

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

さて、あなたは好きなだけMyThingをサブクラス化することができますし、すべてであなたのboto.ec2.instance.Instanceをキャストする必要はありません。それはあなたのオブジェクトの中では多かれ少なかれ不透明な要素のままです。

+0

+1可能であれば、継承上の合成。 –

+0

私がサブクラス化したいクラスは、追加しているクラス(実際にはいくつかの属性)よりもはるかに複雑です。ラップされたクラスのすべての機能を公開するには、たくさんのラップされた関数/プロパティが必要です。私はコンポジション対継承の問題を理解していますが、コンポジションルートを作成することは、このケースでは価値があるよりも難しいようです。 – iconoplast

+1

@iconoplast: "ラップされた関数やプロパティがたくさん必要です"。どうして?インスタンスの名前は常にmyThing.ec2_instanceです。 EC2インスタンスのプロパティとメソッドを直接呼び出すことができないのはなぜですか?それ以外に何が起こっているのですか? –

関連する問題