赛博空间7号

The greatest enemy of knowledge is not ignorance, it is the illusion of knowledge.--Stephen William Hawking

Inheritance and Composition --继承与组合

前言:继承与组合是编程的两种方式。继承完全可以用组合来代替,而且要尽量避免多继承。


继承与组合的概念:

继承:一个类可以从另一个类继承属性,类似父子关系,一脉相承但不完全相同。

组合:一个类可以由其他类组成,类似车与轮子的关系。


继承可以用组合代替

关于继承,我们知道父类与子类有三种交互方式:子类暗含这父类的行为;子类覆盖父类的行为;子类alter父类的行为。

我们下面使用代码进行解释,首先来一段使用继承的代码:

class Parent():

    def override(self):
        print("PARENT override()")
    def implicit(self):
        print("PARENT implicit()")
    def altered(self):
        print("PARENT altered()")

class Child(Parent):

    def override(self):
        print("CHILD override()")
    def altered(self):
        print("CHILD,BEFORE PARENT altered()")
        super(Child,self).altered()
        print("CHILD,AFTER PARENT altered()")

dad = Parent()
son = Child()

dad.implicit()
son.implicit()

dad.override()
son.override()

dad.altered()
son.altered()

output:

PARENT implicit()
PARENT implicit()
PARENT override()
CHILD override()
PARENT altered()
CHILD,BEFORE PARENT altered()
PARENT altered()
CHILD,AFTER PARENT altered()

再来一段组合的代码来实现上面的功能:

class Other():

    def __init__(self):
        self.name = "other"
    def override(self):
        print("OTHER override()")
    def implicit(self):
        print("OTHER implicit()")
    def altered(self):
        print("OTHER altered()")

class Child():

    def __init__(self):
        self.sex = "boy"
        self.other = Other()
    def implicit(self):
        self.other.implicit()
    def override(self):
        print("CHILD override()")
    def altered(self):
        print("CHILD,BEFORE OTHER altered()")
        self.other.altered()
        print("CHILD,AFTER OTHER altered()")

other = Other()
son = Child()

print(other.name)
print(son.other.name,son.sex)

other.implicit()
son.implicit()

other.override()
son.override()

other.altered()
son.altered()

other
other boy
OTHER implicit()
OTHER implicit()
OTHER override()
CHILD override()
OTHER altered()
CHILD,BEFORE OTHER altered()
OTHER altered()
CHILD,AFTER OTHER altered()

可见组合也完成了与继承相同的功能.


那么,我们何时使用继承,何时使用组合呢?这里有三个原则

  1. 不惜一切代价避免多继承。

  2. 使用组合将代码打包为模块,这样模块可以用在很多不同不相关的地方上。

  3. 仅当有明显相关的可重复使用的代码片段符合单一通用概念或者由于你从事的事情不得不使用继承时才使用继承。

不要拘泥于这些规则,学会根据实际情况应变。


参考:Learn python3 the hard way

发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

© 版权所有:沈阳市和平区赛博空间咨询部|辽ICP备18005891号
Powered by Z-BlogPHP & Yiwuku.com