Предположим, у меня есть класс «композиция» и класс «слой». Предположим, что экземпляр класса слоя не может существовать без экземпляра класса композиции, а экземпляр класса композиции может иметь несколько экземпляров слоя. Методы класса слоя должны иметь доступ к членам класса композиции. Это не совсем наследование, потому что каждый экземпляр слоя должен «содержаться» в одном экземпляре класса композиции.
Например, если мой класс композиции состоит из трех членов «comp_width», «comp_height» и списка, называемого «Layers», каждый слой в списке должен иметь возможность вызывать свои собственные методы, которые имеют доступ к «comp_width» и «comp_height». "переменные.
Есть ли способ настроить эту конкретную структуру классов в Python? Если да, то можете ли вы привести пример? Я не уверен, что это можно сделать.






Один из подходов - создать layer с уже существующим composition. Это позволит вам передать объект composition каждому объекту layer во время создания.
class Layer:
def __init__(self, composition, name):
if not isinstance(composition, Composition):
raise TypeError(
'instance of the layer class cannot exist without an instance '
'of the composition class')
self.composition = composition
self.name = name
def __repr__(self):
return self.name
def get_composition_info(self):
return (
'composition [{}] with size [{} x {}] and layers {}'
.format(
self.composition.name,
self.composition.height,
self.composition.width,
self.composition.layers))
class Composition:
def __init__(self, name, height, width):
self.layers = list()
self.name = name
self.height = height
self.width = width
def __repr__(self):
return self.name
def create_layer(self, name):
layer = Layer(self, name)
self.layers.append(layer)
return layer
comp = Composition('my_composition_1', 10, 2)
l_1 = comp.create_layer('layer_1')
l_2 = comp.create_layer('layer_2')
print(comp)
print(comp.layers)
print(l_1)
print(l_1.get_composition_info())
Вывод print()s:
my_composition_1
[layer_1, layer_2]
layer_1
composition [my_composition_1] with size [10 x 2] and layers [layer_1, layer_2]
__init__()вашего класса «слой» должен иметь параметр, определяющий содержащую «композицию», который, возможно, будет сохранен вself.composition. Другие методы могут использоватьself.composition.comp_widthи т. д.