Python:从超类构造multipleinheritance子类实例

2024-09-23 22:26:22 发布

您现在位置:Python中文网/ 问答频道 /正文

所以在我的项目中有两个类:CircuitSubCircuit。有时我可能需要从Circuit构造一个SubCircuit。有没有比下面四行更优雅的方法呢?Circuit可能会在某个时候得到一些新的属性,例如,这意味着转换也需要更新-基本上是邀请bug。你知道吗

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

Tags: selfinputoutputsizeinitdefportsclass
1条回答
网友
1楼 · 发布于 2024-09-23 22:26:22

bug已经存在了—当您将self.gates = circuit.gatescircuit.gates作为一个列表时,您会将两个引用指向同一个列表—如果此列表在原始电路上更新,则此更新将反映在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之前的最后一个,并吞下剩余的参数)

相关问题 更多 >