2016-07-01 2 views
0

私はPythonの初心者です。基底クラスでネットワークや他のいくつかのコンポーネントに多くの依存関係があるため、子クラスのメソッドをテストする必要があります。私の子クラスのメソッドは スタンドアロンです。Pythonで基本クラスをインスタンス化せずに子クラスのメソッドをテストする方法は?

子クラスから基本クラスメソッドを削除して新しい子クラスを作成しようとしましたが、機能しません。ここにコードがあります。

def remove_base(child_cls, base_cls): 
    allmembers = inspect.getmembers(child_cls, predicate=inspect.ismethod) 
    allmembers_dict = dict(allmembers) 
    hbasemembers = inspect.getmembers(base_cls, predicate=inspect.ismethod) 
    hbase_dict = dict(hbasemembers) 
    child_class_member = set(allmembers_dict.keys()) - set(hbase_dict.keys()) 
    new_dict = {} 
    for key in allmembers_dict.keys(): 
     for child_member in child_class_member: 
      if key == child_member: 
       new_dict[key] = allmembers_dict[key] 
    return new_dict 

class A: 
    def add(self, i): 
     print i + 1 

class B(A): 
    def sub(self, i): 
     print i - 1 

newB = type("newB", (object,), remove_base(B, A)) 
b = newB() 
b.sub(5) 

エラーメッセージは次のとおりです。

TypeError: unbound method sub() must be called with B instance as first argument (got int instance instead)

私は、基本クラスのメソッドを除去する方法が間違っているかもしれないと思います。 この問題の処理方法は?

+0

。あなたの子メソッドが親から完全に独立しているなら、あなたは全く継承するべきではありません。 – Cyrbil

+1

と呼ばれることwouild '呼び出すことなく、親のメソッドをオーバーライドします –

+1

あまり抽象的な例はありませんか?あなたの現在の例では、明白な答えは、 'self'を全く使わないので、それらのメソッドの両方を' @ staticmethod'にすることです。 'B.sub'をインスタンス化することなく。文脈がなければ、これは[XY問題](http://meta.stackexchange.com/q/66377/248731)のように思えます。 – jonrsharpe

答えて

0

あなたは直接Bから__dict__を使用することができます。

class A(object): 
    def add(self, i): 
     print(i + 1) 

class B(A): 
    def sub(self, i): 
     print(i - 1) 

newB = type("newB", (object,), dict(B.__dict__)) 
b = newB() 
b.sub(5) 
はsuper`がそう唯一の子の実装が間違っている事は、あなたの継承構造である
関連する問題