抽象類和介面類
首先需要明確的是介面類和抽象類是由java語言中發展來的概念,它是java中的一種設計規范或方法,
Python提供了對抽象類的支持借助于 abc 模塊
Python中可以沿用介面類的概念編程但是 Python不提供具體的實作方式,也就是說 Python中并沒有介面類 但是依然可以使用介面類的設計方式來規范代碼
介面類的設計提倡功能設計的簡單,專一,不要將介面設計的臃腫而復雜,介面需要盡可能的降低耦合,遵循介面隔離原則,
抽象類推薦單繼承,介面類的使用鼓勵多繼承(細化介面,依據實際需求把握粒度),
抽象類
抽象類是抽取多個功能具有相似點的類而形成的新類,由于它是多個類的共同點的抽象,因此它天生就是為繼承而存在,
抽象類是一個特殊的類,它的特殊之處在于只能被繼承,不能被實體化
允許在類內部實作某些方法,抽象類的內部允許一般的實體方法,而不一定都要是抽象方法
抽象類要將子類中一致的方法實作,這樣避免在多個子類中重復的實作一樣的方法造成冗余,例如BasePerson類中實作了sleep方法,因為所有的人都會睡覺,且睡覺的行為一致,但是say方法沒有實作,因為不同的角色說話的方式是不同的,需要在子類中自己來實作,
介面類
嚴格的講Python中就沒有 介面類這么個東西,僅僅對抽象類提供支持 abc,但是介面隔離的思想依然是可以用的,靠程式員自己來約束,不要被定義和名稱框死,也沒必要過分糾結~ ,畢竟我們最終目的是寫出優雅穩健的代碼,
- 介面類中不允許有構造方法
- 介面類中必須不能實作任何方法
- 介面類定義需要遵循介面隔離原則和單一化原則
- 介面隔離:盡可能的將介面粒度細化,
- 單一原則:盡可能將介面的職責單一化,
例子
import abc
class Developer(metaclass=abc.ABCMeta):
"""這個 看似他遵循了介面類的定義~ 但是僅僅是為了遵循介面隔離設計思想,"""
@abc.abstractmethod
def coding(self):pass
@abc.abstractmethod
def debug(self):pass
class Teacher(metaclass=abc.ABCMeta):
@abc.abstractmethod
def teach(self):pass
class BasePerson(metaclass=abc.ABCMeta):
""" 抽象類"""
@abc.abstractmethod
def say(self):pass # 抽象方法
def sleep(self): # 可以實作方法,并且不要求子類必須實作這個方法,
print("我會睡覺")
class ComputerTeacher(BasePerson,Developer,Teacher):
def coding(self):
print("我會編程")
def teach(self):
print("我會教學生")
def say(self):
print("我將會教學生一些編程的方法和技巧!")
def debug(self):
print("天天就會寫bug!!!")
a = ComputerTeacher()
a.say()
a.sleep()
a.teach()
a.coding()
a.debug()
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/119153.html
標籤:Python
上一篇:python8道練習題
