Python父子级特定的类结构

时间:2018-10-08 02:11:33

标签: python python-3.x class inheritance nested

假设我有一个“ composition”类和一个“ layer”类。假设没有合成类的实例就不能存在图层类的实例,并且合成类的实例可以具有多个图层实例。图层类的方法需要能够访问组合类的成员。这并不是完全继承,因为每个图层实例都应该“包含”在composition类的单个实例中。

例如,如果我的组合类具有三个成员“ comp_width”,“ comp_height”和一个名为“ layers”的列表,则列表中的每一层都应该能够调用自己的方法,这些方法可以访问“ comp_width”和“ comp_height”变量。

是否有某种方法可以在Python中设置这种特殊的类结构?如果是这样,您能举个例子吗?我不确定是否可以做到这一点。

1 个答案:

答案 0 :(得分:1)

一种方法是使用已经存在的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]