所以在我的项目中有两个类:Circuit
和SubCircuit
。在某些时候,我可能需要从SubCircuit
构造一个Circuit
。有没有比下面的最后4行更优雅的方法了?例如,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
最佳答案
错误已经存在-当您执行self.gates = circuit.gates
,circuit.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个,这可能有点矫over过正,因为Python的对象不处理传递给自己的__init__
方法的额外参数。 (因此,您必须在基类__init__
中验证它们是否是方法解析顺序上object
之前的最后一个,然后吞下其余的参数)关于python - Python:从父类(super class)构造多继承子类实例,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42890775/