2017-04-20 9 views
1

私はpythonクラスを実装しています。このクラスは、渡されたパラメータに基づいて型が決定されるコンストラクタ内に別のオブジェクトを構築します。たとえば、"workerA"のコードでは、クラス"MyAClass""workerB"の動作があります。オブジェクトの動作は"MyBClass"です。コンストラクタに渡されるパラメータに基づいてPythonクラスを実装します

BaseClassが既に変更されていない別のコードで使用されているため、このメソッドを別のクラスをベースクラスから派生させる代わりに使用しています。だから、私が"MyBClass"の振る舞いについてBaseClassの別の振る舞いをしたいのであれば、それにパラメータdbtype = "MyBClass"を渡す必要があります。

同じ結果が得られるより良い方法はありますか?

import sys 

    # MyAClass definition 
    class MyAClass : 

    def __init__(self, serverSettings): 
     self._serverSettings = serverSettings 

    def initialize(self): 
     self._init = 1; 
     print("Calling", sys._getframe(1).f_code.co_name) 

    def add(self): 
     self._init = 2; 
     print("Calling", sys._getframe(1).f_code.co_name) 

    def finalize(self): 
     self._init = 3; 
     print("Calling", sys._getframe(1).f_code.co_name) 

    def __del__(self): 
     print('Calling destructor of class ', self.__class__.__name__) 


    # MyBClass definition 
    class MyBClass : 

    def __init__(self, serverSettings): 
     self._serverSettings = serverSettings 

    def initialize(self): 
     self._init = 1; 
     print("Calling", sys._getframe(1).f_code.co_name) 

    def add(self): 
     self._init = 2; 
     print("Calling", sys._getframe(1).f_code.co_name) 

    def finalize(self): 
     self._init = 3; 
     print("Calling", sys._getframe(1).f_code.co_name) 

    def __del__(self): 
     print('Calling destructor of class ', self.__class__.__name__) 


    # The base class which will be called in main program 
    class BaseClass : 

    def __init__(self, serverSettings, dbtype = None): 

     if(dbtype == None): 
      self.__worker = MyAClass(serverSettings) 
     elif(dbtype == "MyBClass") : 
      self.__worker = MyBClass(serverSettings) 
     else : 
      print("Undefined type") 

    def initialize(self): 
     self.__worker.initialize() 

    def add(self): 
     self.__worker.add() 

    def finalize(self): 
     self.__worker.finalize() 


    if __name__ == "__main__": 

    serverSettings = dict() 

    serverSettings["address"] = "localhost" 
    serverSettings["name"] = "Testname" 

    workerA = BaseClass(serverSettings) 
    workerA.add() 

    workerB = BaseClass(serverSettings, dbtype = "MyBClass") 
    workerB.finalize() 
+0

に基づいて、次のコード変更をした、あなたは可能性がありちょうど適切なクラスを使用してください。 –

+0

@ Kluas D、クラスを渡す方法を試してみました。私には、私が実装したものよりも良い方法のように思えました。ありがとう – Gourish

答えて

1

これは元のプログラムと同じ出力を生成しませんが、あなたの目的のためにこの作業のようなものでしょうか?上記のようにメソッド名を照会しない限り、機能的には同じ結果が得られるはずです。

class BaseClass : 
    def __init__(self, serverSettings, dbtype=None): 

     if(dbtype == None): 
      self.__worker = MyAClass(serverSettings) 
     elif(dbtype == "MyBClass") : 
      self.__worker = MyBClass(serverSettings) 
     else : 
      print("Undefined type") 

    def __getattribute__(self, x): 
     settings = object.__getattribute__(self, '__dict__').get('_BaseClass__worker') 
     return settings.__getattribute__(x) 

このようないくつかのクラスtwizzingを使用して代わりに、:

class BaseClass : 
    def __init__(self, serverSettings, dbtype='MyAClass'): 
     dbtypes = {'MyAClass': MyAClass, 
        'MyBClass': MyBClass} 
     if dbtype not in dbtypes: 
      raise("Undefined type") 
     self.__class__ = dbtypes[dbtype] 
     self.__init__(serverSettings) 
0

私が代わりに `dbtype`引数を使用しての提案

class BaseClass : 

    def __init__(self, serverSettings, Classtype = MyAClass): 

     authclasses = [MyAClass, MyBClass] 
     if Classtype not in authclasses : 
      self.__worker = MyAClass(serverSettings) 
     else : 
      self.__worker = MyBClass(serverSettings) 

    def __getattribute__(self, x): 
     settings = object.__getattribute__(self, '__dict__').get('_BaseClass__worker') 
     return settings.__getattribute__(x) 
関連する問題