2012-03-19 14 views
3

私は人々が自分のプラグインを書くことを可能にするフレームワークを提供しようとしています。これらのプラグインは基本的に派生クラスです。私の基本クラスは初期化するためにいくつかの変数を必要とします、私はどのように私の派生クラスが基本クラスの初期化で変数をフィードすることなく、私の基本クラスを初期化できますか?これは私が気にするプラグインを書き込み、ユーザーを望んでいないものですので、派生クラスから来ない変数で基底クラスを初期化する

#!/bin/python 

class BaseClass(): 
    def __init__(self,config): 
     self.config=config 
    def showConfig(self): 
     print "I am using %s" % self.config 

class UserPlugin(BaseClass): 
    def __init__(self,config): 
     BaseClass.__init__(self,config) 
    def doSomething(self): 
     print "Something" 


fubar = UserPlugin('/tmp/config.cfg') 
fubar.showConfig() 

私の目標は、UserPluginクラスのconfigパラメータを定義する必要性を回避するためです。

+0

私はあなたの質問を理解していません。 'UserPlugin'がインスタンス化されると、プラグインの作成者に設定パスを渡させたくないのですが、どこから設定パスを取得したいのですか?デフォルトの設定パスを持っていますか?あなたが 'UserPlugin'をインスタンス化すると' BaseClass .__ init __() 'が呼び出されますが、' UserPlugin'インスタンスは初期化されています。 – senderle

+0

リファラリングのおかげでそれはまさにそれだから私の質問。私はBaseClassがUserPluginの起動時に開始されることを理解する。要するに、私は、UserPluginが派生クラスにその変数を渡さずに変数を初期化する必要のある、BaseClassからメソッドを継承するためのきれいな方法を欲しいということです。 継承を忘れて、ベースクラスを最初に開始してから、BaseClass内でUserPluginを開始することも可能ですが、少し醜いことがわかります。 –

+0

しかし、あなたはまだ私の質問に答えなかった。どこから設定パスを取得しますか? [私は野生の推測を取った](http://stackoverflow.com/a/9786902/577088)、しかし。 – senderle

答えて

1

あなたは、基本クラスに任意の残りの引数を渡すためにargument listsを使用することができます:あなたペーストビンコードに基づいて

class UserPlugin(BaseClass): 
    def __init__(self, *args, **kwargs): 
     BaseClass.__init__(self, *args, **kwargs) 
+0

はい、私は理解しますが、それは投稿されたコードとそれほど違いはなく、何とか避けたいものです。私はクラスの継承を忘れて、開始されたbaseclassまたはその行に沿った何かの中でプラグインクラスを開始しなければならないと思います。しかし、情報をありがとう。 –

1

、これはどう?これにより、クラス属性を使用する代わりに、別個のグローバルを使用することが回避されます。クラス属性は、派生クラスとそのインスタンスすべてのメンバとしてアクセス可能です。

#!/bin/python 

class BaseClass(): 
    config = '/tmp/config.cfg' 
    def __init__(self): 
     pass 
    def showConfig(self): 
     print "I am using %s" % self.config 

class UserPlugin(BaseClass): 
    def __init__(self): 
     BaseClass.__init__(self) 
    def doSomething(self): 
     print "Something" 


fubar = UserPlugin() 
fubar.showConfig() 

これは以前に言及したもう1つの方法でした。すなわちBaseClass.config = '/foo/path'(あなたがBaseClass.config自体の値を変更したい場合は、あなたが直接それにアクセスする必要があることに注意してください、そうでない場合は、カスタムUPinstance.config値を作成する羽目になる、そのままBaseClass.configを残し

+0

オブジェクトと継承の仕組みを理解しています。私の実際の目標は、UserPluginクラスを、基本クラスを正しく初期化するために必要なものを自由にすることです。これは愚かであり、ある意味では聞こえるが、派生クラスを可能な限り低くするための「要件」を維持したい。これは構文的な質問よりむしろ組織的な問題です。一方、私はBaseClassが初期化するために必要な変数のグローバル化を考えました。ここを参照してくださいhttp://pastebin.com/KfdVYbPzグローバルは理想的ではないので、可能であれば避けるべきですが、私の場合は最良の選択だと思います。 –

+0

@jay_t、私はあなたの最高の選択肢だとは思わない。クラス属性として保存することができます。上記を参照。 – senderle

関連する問題