1. 程式人生 > >笨方法學python3: ex44筆記

笨方法學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__()# 

然而沒說在多重繼承中怎麼用。

合成

合成也能完成繼承的任務,比如:

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. 只有在程式碼之間可以用一個變數連線或非用不可時,才去用繼承

不要成為規則的奴隸,該用還是要用的。比如你的合作者或同事已經用了多重繼承去寫程式碼。

課後作業