Composite
A composite is a mechanism which handles a single object (scalar) or a composite of objects the same. This can be made easier in python by overriding the __iter__
method.
python
from abc import ABC
from collections.abc import Iterable
class Connectable(Iterable, ABC):
def connect_to(self, other):
if self == other:
return
for s in self:
for o in other:
s.outputs.append(o)
o.inputs.append(s)
class Neuron(Connectable):
def __init__(self, name):
self.name = name
self.inputs = []
self.outputs = []
# def connect_to(self, other):
# self.outputs.append(other)
# other.inputs.append(self)
def __iter__(self):
yield self
def __str__(self):
return f'{self.name}, {len(self.inputs)} inputs, {len(self.outputs)} outputs'
class NeuronLayer(list, Connectable):
def __init__(self, name, count):
super().__init__()
self.name = name
for x in range(0, count):
self.append(Neuron(f'{name}-{x}'))
def __str__(self):
return f'{self.name} with {len(self)} neurons'
if __name__ == '__main__':
neuron1 = Neuron('n1')
neuron2 = Neuron('n2')
layer1 = NeuronLayer('L1', 3)
layer2 = NeuronLayer('L2', 4)
neuron1.connect_to(neuron2)
neuron1.connect_to(layer1)
layer1.connect_to(neuron2)
layer1.connect_to(layer2)
print(neuron1)
print(neuron2)
print(layer1)
print(layer2)