“ 除了继承,合成也是一种直接使用别的类和模块的方法。”
01
—
类的合成范式
和继承一样,合成可以让我们直接使用别的类里面的函数和方法,不同的是,这种做法并不会在子类中修改和覆盖父类的函数内容,最直接的好处是可以避免混乱。
在合成方法中,我们并不需要申明Child中的对象(object)是继承自父类,也就是代码中的Other。之所以用Other而不用Parent,是因为我们想区分和继承的差别。合成的关键代码就是self.other = Other(),有了这一行代码,下面的工作就很自然了。我们在Child类中,定义一个function(),并在里面直接使用other.function(),从而达到了合成效果:让Child类中function和Other类中的function合成为一。
运行结果:
02
—
一个有趣的例子
合成和用途十分广泛,比如我们拿最近很火的吃鸡游戏来举例。游戏里面有各种各样的枪械武器,每一种枪械都有其各自的属性,比如射程,穿透力,子弹大小啊之类的。最直接的想法是给枪建造一个类,里面存储了各种各样的属性,用来定义这种枪的各种属性。那如果一个玩家获得了这把枪,而且假设玩家也是一个类,那么如和处理这两个类之间的关系呢?答案就是用合成:
我们定义了一个Gun的类,它的名字的鼎鼎有名的98K,为了方便起见,我们只给了它一个攻击力的属性,一枪888暴击伤害。然后在玩家类的武器weapon属性栏,我们通过self.weapon=Gun(),给他配备了这把枪。最后,我们实例化玩家,建立了一个名字叫Jack的玩家,打印这个玩家的武器名字,发现的确他拥有一把98K。
运行结果:
03
—
一个实际的例子
我们直到圆环是一个内圆和一个外圆组成的,圆环的面积是外面面积减去内圆面积,而周长却是内圆加上外圆周长。
那么我们给大家示范一下怎么利用类的合成完成圆环的面积和周长计算:
我们先定义一个圆类,注意到计算圆选哟用到圆周率pi,所以我们先import进来圆周率。我们拿半径为10的一个圆的实例C1试水,发现结果是对的。接着我们再定义圆环:
圆环是由内圆和外圆组成,但是不论是内还是外,它们都是圆,所以我们利用这种关系,加上类的合成,让圆环的外圆和内圆分别使用到圆这个类的基本函数:计算面积和计算周长。最终我们有条例地计算出圆环的周长和面积。
运行结果: