笨方法学python3笔记: ex44继承与合成

我们的OOP程序员,就像英雄永远会遇险一样,总会遇到叫继承的“天险”。

老道的程序员会尽力避开这道天险,因为他们知道这里水有多深。

直接说结论吧:所有继承都能用合成来替代,而多重继承无论如何都要避免。

主要概念及其英文

  1. 类:class
  2. 继承:inheritance
  3. 合成:composition

继承

继承意思是一个子类会“继承”母类的大多数特征。子母类的交互方式有:子imply/override/alter母的action。

  1. 隐式继承(implicit): 当你调用子类的一个函数,python会先在子类中找,如果子类没有,会再去母类中找。若在母类中找到,则属于implicit
  2. 显示复盖(override):在子类定义母类中有的一个函数,python在子类找到后,就直接用了。也就是覆盖了母类的这个函数
  3. 改动(alter):使用super函数

ex44_inherit.py

class Parent(object):
    
    def implicit(self):
        print("PARENT implicit()")
    def override(self):
        print("PARENT override()")
    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()

为啥用 super()

书里大概是说可以用来处理多重继承:

class SuperFun(Child, BadStuff):
    pass

且多重继承多半用于如下情况。

using super() with __init__
class Child(Parent):
    
    def __init__(self, stuff):
        self.stuff = stuff
        super(Child, self).__init__()# 

然而没说在多重继承中怎么用。

合成

合成也能完成继承的任务,比如:

ex44e.py

class Other(object):
    
    def override(self):
        print("OTHER override()")
        
    def implicit(self):
        print("OTHER implicit()")
        
    def altered(self):
        print("OTHER altered()")
        
class Child(object):
    
    def __init__(self):
        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()")
        
son = Child()

son.implicit()
son.override()
son.altered()

这个Other类可以另存为.py文件,然后当做模块导入。或许就叫other.py

继承还是合成?

  1. 极力避免多重继承——它要花很多精力去学习,却只能带来一点方便

  2. 如果要在许多不同且无关的情况下用到重复的代码,请使用合成处理代码。

  3. 只有在代码之间可以用一个变量连接或非用不可时,才去用继承

不要成为规则的奴隶,该用还是要用的。比如你的合作者或同事已经用了多重继承去写代码。

课后作业

阅读python的代码规范,尽力按其中的要求写代码。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章