Python:从超类构造多继承子类实例

时间:2017-03-19 18:54:16

标签: python inheritance type-conversion multiple-inheritance

所以我在我的项目中有两个类:CircuitSubCircuit。在某些时候,我可能需要从SubCircuit构建Circuit。有没有一种更优雅的方式来做到这一点,而不是在最后4行中做到的?例如,Circuit可能会在某些时候获得一些新属性,这意味着转换也需要更新 - 基本上是邀请错误。

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 个答案:

答案 0 :(得分:1)

错误已经存在 - 当您self.gates = circuit.gatescircuit.gates作为列表时,yu指向同一列表的引用 - 如果此列表在原始电路上更新,则此更新将是反映在subcircuit实例中。

我认为最合理的模式是,如果你有一个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个,这可能有点过分,因为Python的对象没有处理传递给它自己的__init__方法的额外参数。 (因此,您必须在基类__init__中验证它们是否是方法解析订单object之前的最后一个,并吞下剩余的args)