Python: 从超类构造多继承子类实例
Python: Constructing a multiple-inheritance subclass instance from a superclass
所以我的项目中有两个 类:Circuit
和 SubCircuit
。在某些时候,我可能需要从 Circuit
构造一个 SubCircuit
。有没有比下面最后 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
错误已经存在 - 当你做 self.gates = circuit.gates
时,circuit.gates
是一个列表,你将两个引用指向同一个列表 - 如果这个列表在原始电路上更新,这个更新将反映在您的 subcircuit
实例中。
我认为最明智的模式是为 class 设置一个备用构造函数,如果您有一个 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
一件 "right" 要做的事情是让 classes __init__
和其他方法通过协同使用 super()
相互调用而不是显式调用 then按名称 - 但是,如果您的 classes 和 subclasses 固定为这 3 个,那可能有点矫枉过正,因为 Python 的对象不处理传递给它的额外参数自己的 __init__
方法。 (因此,您必须在基础 classes __init__
中验证它们是否是方法解析顺序中 object
之前的最后一个,并吞下剩余的参数)
所以我的项目中有两个 类:Circuit
和 SubCircuit
。在某些时候,我可能需要从 Circuit
构造一个 SubCircuit
。有没有比下面最后 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
错误已经存在 - 当你做 self.gates = circuit.gates
时,circuit.gates
是一个列表,你将两个引用指向同一个列表 - 如果这个列表在原始电路上更新,这个更新将反映在您的 subcircuit
实例中。
我认为最明智的模式是为 class 设置一个备用构造函数,如果您有一个 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
一件 "right" 要做的事情是让 classes __init__
和其他方法通过协同使用 super()
相互调用而不是显式调用 then按名称 - 但是,如果您的 classes 和 subclasses 固定为这 3 个,那可能有点矫枉过正,因为 Python 的对象不处理传递给它的额外参数自己的 __init__
方法。 (因此,您必须在基础 classes __init__
中验证它们是否是方法解析顺序中 object
之前的最后一个,并吞下剩余的参数)