1

私のプロジェクトでは、CircuitSubCircuitという2つのクラスがあります。ある時点でCircuitからSubCircuitを構築する必要があるかもしれません。最後の4行で以下のことを行うよりも、よりエレガントな方法がありますか? Circuitは、たとえばある時点で新しい属性を取得する可能性があります。これは、変換も更新する必要があることを意味し、基本的にはバグを招きます。Python:スーパークラスから複数継承のサブクラスインスタンスを構築する

class Gate(abc.ABC): 
    def __init__(self, size): 
     self.in_ports = (InPort(self),) * size 
     self.out_ports = (OutPort(self),) * size 


class Circuit: 
    def __init__(self, size): 
     self.input = (OutPort(self),) * size 
     self.output = (InPort(self),) * size 
     self.gates = [] 

    # ... some other stuff that messes around with these attributes 


class SubCircuit(Gate, Circuit): 
    def __init__(self, circuit=None): 
     Gate.__init__(self, size) 
     Circuit.__init__(self, size) 

     if circuit is not None: 
      self.gates = circuit.gates 
      self.input = circuit.input 
      self.output = circuit.output 

答えて

1

バグが既に存在している - あなたがリストであるself.gates = circuit.gatescircuit.gatesを行うとき、湯が同じリストに両方の参照を指す - と、このリストは、元の回路に更新されている場合、この更新は、あなたのsubcircuitに反映されますインスタンス。

私が最も健全なパターンtehreは、あなたがあなた自身を更新するからcircuitインスタンスを持っている場合は、クラスの代替コンストラクタを持つことであると思う:行うには

from copy import copy 
class SubCircuit(Gate, Circuit): 
    def __init__(self, size): 
     Gate.__init__(self, size) 
     Circuit.__init__(self, size) 

    @classmethod 
    def from_circuit(cls , circuit, size): 
     self = SubCircuit(size) 
     for key, value in circuit.__dict__.items(): 
      setattr(self, key, copy(value)) 
     return self 

一つの「正しい」ものは作ることですクラス__init__とその他のメソッドは、super()を明示的に呼び出すのではなく、代わりに呼び出します。しかし、クラスとサブクラスがこれらの3に固定されていると、余分なパラメータを処理しないため独自の__init__メソッドに渡されます。 (したがって、__init__は、メソッド解決順序のobjectより前の最後のものであるかどうかを確認し、残りの引数を呑み込む必要があります)

+0

その動作は、回路が編集されると、他の回路でそれを表すサブ回路構成要素も同様に編集されるべきである。このバグをすぐに考慮する理由はありますか? –

+0

いいえ、それは望みの結果です。すべての言及を「コピー」するだけです。予期せぬものであるかもしれません。 – jsbueno

+0

それから、上のliens [ - :3-1]の 'for'ループの代わりに' self .__ dict____ update(circuit .__ dict__) 'を実行するだけです。 – jsbueno

関連する問題