PYTHON 繼承 – (PYTHON教程) – JS Inheritance 繼承就是把多個相似的Class, 來歸類為一個抽象的Class. 例如在我們可以把狗類, 馬類, 羊類等, 歸類為一個新的抽象類, 即動物類.
為何要在Python裏用繼承
- Python本身為一個不太Structure的語言, 加上即時Compile, 所以令到Python適合用作實驗等Programming, 如用Jupiter, 只有一行Program, 都可立即更新應用, 這是一個非常大的好處. 但問題是, 當你實作了大量的Code, 就會難於管理重用, 所以要以類作來把它結構化.
- 而當你要結構化, 會使用類, 但當你做下去, 便會想更類更為強化, 為了做得更好一點, 有需要時就會使用繼承.
而用繼承又有何好處呢?
- 代碼重用, 這不多說了.
- 為子類們可以有相同的method, property, 可以在日後中用List, Array等把它們串連起來, 再用foreach迴圈等令它們可以一起運作, 在相同的code流程下.
- 而子屬類可以用override把method重寫, 令到coding 可以用同一個for loop 內引用同一套流程 (如control flow等), 但內裏又可以有不同的程式內容, 去實作程序流程. 這樣可令編程更短而精.
而用繼承又有如何實作呢?
- 最簡單的做法, 就用我在那個抽象的class(如動物類)的例子來說明.
- 我們可以把在他的子類(狗類, 馬類, 羊類)的method, property等的相同code抽出來, 放在抽象類中, 以供子類重用.
- 而當以也可反過來, 先設立抽象Class, 再以此為基礎來發展出新的後屬類, 但能否做到如此就看是否了解該類了 (Bussiness Logic).
以下會舉一個簡單的生活例子 (Inherit 繼承) 以顯示出Inheritance 的基本用法, 以下供各位參考:
Master Class: |
class Master(metaclass=abc.ABCMeta): @abc.abstractmethod def Play(self): pass @abc.abstractmethod def Sleep(self): pass @abc.abstractmethod def Eat(self): pass @abc.abstractmethod def UpdateState(self): pass @abc.abstractmethod def isSleepy(self): pass @abc.abstractmethod def isBoring(self): pass @abc.abstractmethod def isDestory(self): pass @abc.abstractmethod def isHungry(self): pass |
Inherit Class Cat: |
class Cat(Master): def init(self , name): self.name = name; self.sleepy = 0; self.boring = 0; self.hungry = 0; def isSleepy(self): return self.sleepy > 80; def isBoring(self): return self.boring > 70; def isDestory(self): return self.boring > 95; def isHungry(self): return self.hungry > 75; def Play(self): print(“Cat ” + self.name + ” Play”); self.boring = 0; def Sleep (self): print(“Cat ” + self.name + ” Play”); self.sleepy = 0; def Eat (self): print(“Cat ” + self.name + ” Play”); self.hungry = 0; def DestoryYourHome (self): print(“Cat ” + self.name + ” Destory Your Home Now”); self.hungry = 0; def UpdateState(self): self.boring+=1; self.sleepy+=1; self.hungry+=1; |
Inherit Class Dog: |
class Dog(Master): def init(self , name): self.name = name; self.sleepy = 0; self.boring = 0; self.hungry = 0; def isSleepy(self): return self.sleepy > 50; def isBoring(self): return self.boring > 80; def isDestory(self): return self.boring > 40; def isHungry(self): return self.hungry > 60; def Play(self): print(“Dog ” + self.name + ” Play”); self.boring = 0; def Sleep (self): print(“Dog ” + self.name + ” Play”); self.sleepy = 0; def Eat (self): print(“Dog ” + self.name + ” Play”); self.hungry = 0; def DestoryYourHome (self): print(“Dog ” + self.name + ” Destory Your Home Now”); self.hungry = 0; def UpdateState(self): self.boring+=1; self.sleepy+=1; self.hungry+=1; |
Running Class: |
HaveFood = True; HaveSlavery = True; animals = [Cat(“Petty”), Dog(“Potty”)] while True: for animal in animals: animal.UpdateState(); if animal.isSleepy(): animal.Sleep(); elif HaveFood and animal.isHungry(): animal.Eat(); elif HaveSlavery and animal.isBoring(): animal.Play(); elif not HaveSlavery and animal.isDestory(): animal.DestoryYourHome(); |
注意事項 |
1) Environment.Run 是入口首先把幾個Cat, Dog的Instance放入List<Master>內 2) 用while及Thread.Sleep 行每秒行一次在foreach的方法內, 會把每一位Master(主子—Cat, dog)的行為行一次 3) 首先UpdateState (在Master class 內的共用方法)然後看看isSleepy, 如果是true 的話就Sleep(); 4) 然後看看HaveFood及isHungry, 如果是true 的話就Eat(); 5) 然後看看HaveSalavry及isBoring, 如果是奴才在家(HaveSalavry== true) 的話就同主子 Play(); 6) 然後看看HaveSalavry及isBoring, 如果是奴才不在家(HaveSalavry == false)的話, DestoryYourHome(); 7) 在Cat同Dog的 isSleepy, isBoring, isDestory, isHungry 內, 大家的Logic也可不一樣。 |
Python類別 – Class, Method, Inheritance, Interface的基礎用法
Python 介面 (類作模仿) – Interface的基本用法 – 加入 for loop, if, Array, Collection的例子
參考網頁: https://docs.python.org/3/tutorial/classes.html#inheritance