一、简介
想必在写程式的过程中,大家或多或少都有听过所谓物件导向 (Object Oriented Programming) 的观念,也就是所谓的 OOP,甚至在业界内流传着"想提早下班,请学好 OOP",接下来的文章会记录着笔者学习设计模式的心路历程,如果在观念上有错或是有甚么问题想讨论的,都欢迎留言讨论
另外每篇文章使用到的 code 都会同步推上笔者的 GitHub 欢迎大家取用参考
二、类别
在开始讲设计模式之前,我们先来认识一下类别以及 OOP 的观念,OOP 最大的三个核心观念就是 "封装"、"继承"、"多型",下面我们会先从甚么是类别开始依序介绍
类别其实是直接从他的英文 class 直接翻译过来的,因此与其称呼她为类别,不如直接叫他物件,也就是物件导向中的物件本人,下面就让我们看看在 Python 中怎么要建立一个物件
class House: floor: int color: str def __init__(self, floor: int, color: str): self.floor = floor self.color = color def __str__(self): return f"这是个楼高 {self.floor} 层,颜色为 {self.color} 的房子"house = House(floor=10, color="red")print(house)
上面的程式当中可以分三块进行解释
属性部分:
可以看到在 House 这个物件当中我们设定了两个属性,分别为 floor 和 color
__init__
部分:
这个部分用来控制,当今天我们在实体化这个物件的时候,我们需要传入甚么样的参数来建立,并且做一些预处理,此处单纯将传入的 floor 以及 color 设定给物件自身
__str__
部分:
这个部份用来控制,当今天使用 print 印出这个物件的时候,会印出什么,是 python 内的写法
下图为执行上述程式后终端机的结果
三、继承
若 B 类别继承了 A 类别,则称 A 类别为 B 的父类别,B 为 A 的子类别,而子类别会拥有父类别所拥有的 function 以及 attribute (私有性质的除外),也可以改写父类别的 function,而在 python 当中想要继承某个类别,则只需要在新建立的类别后面用括号加上想继承的父类别名称即可,下方付上範例
class BaseHouse: floor: int color: str def __init__(self, floor: int, color: str): self.floor = floor self.color = color def __str__(self): return f"这是个楼高 {self.floor} 层,颜色为 {self.color} 的房子"class Apartment(BaseHouse): def __str__(self): return f"这是一个楼高 {self.floor} 层的公寓,颜色为 {self.color}"class Skyscraper(BaseHouse): def __str__(self): return f"这是一个楼高 {self.floor} 层的摩天大楼,颜色为 {self.color}"apartment = Apartment(floor=10, color="red")skyscraper = Skyscraper(floor=101, color="green")print(apartment)print(skyscraper)
上方的程式当中我们可以看到,笔者先建立一个 BaseHouse 作为房子的基本类别,并于下方建立 Apartment 以及 Skyscraper 两个类别且继承 BaseHouse,这样我们可以确保继承 BaseHouse 的类别都会有 color 以及 floor 这两个属性,并于两个子类别中修改 __str__
中回传的内容
下图为执行结果