面向對象筆記整理
最近一直在學習面向對象編程的思維,逐漸的理解是最大的收穫了,對本週學習的筆記進行一個小結(可能會比較亂),如果有更好的學習方法也請推薦一波吧!
一.面向對象的三個基本特徵。
1. 封裝性
2. 繼承性
3. 多態性
① 定義類:格式:
class 類名(父類):
類體
進一步採用 <對象名>.<屬性名> or <對象名>.<方法名>() 體現類功能
實例變量 | def __init__(self,<其他參數>) |
---|---|
類變量 | 類中的變量,所有實例(或對象)所共有 |
構造方法 | __init__不用傳入self參數 |
實例方法 | self.實例變量。 調用實例方法不需傳入self參數 |
類方法 | 類對象的方法,由所有實例對象共享。採用 <類名>.<方法名>(<參數列表>) or<對象名>.<方法名>(<參數>)注意☆:1.需要加@classmethod裝飾器 2. 第一個參數約定爲cls |
靜態方法 | 定義在類中的普通函數,能夠被所有實例對象共享。 採用<類名>.<方法名>(<參數>) or <對象名>.<方法名>(<參數>) 注意☆:1.靜態方法可以沒有參數。2.需要加@staticmethod聲明3.不可以操作實例屬性和實例方法 |
自由方法 | 類中的普通函數。實例方法採用<對象名>.<方法名>(<參數>)方法使用 |
保佑方法 | 由雙下劃線開始和結束的方法。e.g. __len__() |
私有方法 | 只需要在方法前加雙下劃線即可def __run(self): 接函數體 |
私有變量:在變量前 下雙下劃線__,(並非真正私有),如要訪問,命名規律爲_類名__變量 就可以訪問量。
② 繼承性
super()函數:可以訪問已在類對象中覆蓋的繼承方法。
@abstractmethod
抽象方法:不能被實例化(創建對象),它的存在就是讓更多的人去繼承它。
(+一個 個人覺得比較好理解的實例)
from abc import ABCMeta, abstractmethod
class Pet(object, metaclass=ABCMeta):
"""寵物"""
def __init__(self, nickname):
self._nickname = nickname
@abstractmethod
def make_voice(self):
"""發出聲音"""
pass
class Dog(Pet):
"""狗"""
def make_voice(self):
print('%s: 汪汪汪...' % self._nickname)
class Cat(Pet):
"""貓"""
def make_voice(self):
print('%s: 喵...喵...' % self._nickname)
def main():
pets = [Dog('旺財'), Cat('凱蒂'), Dog('大黃')]
for pet in pets:
pet.make_voice()
if __name__ == '__main__':
main()
多繼承的特點:
當子類實例調用一個方法時,先從子類中查找,如果沒有找到則查找父類。
查找順序安子類聲明父類列表從左往右中查找,如找不到父類再找父類的父類。
多態的概念:1.繼承——多態發生一定是子類和父類之間
2.重寫——子類重寫父類的方法
③ 枚舉類(本質上也是一種類: import enum)
在python 中定義枚舉類語法格式如下:
class 枚舉類名 (enum.Enum):
枚舉常量列表
枚舉類繼承自enum.Enum 類。 枚舉中會定義多個常量成員。給個示例:
import enum
class WeekDay(enum.Enum):
#枚舉常量列表
MONDAY = 1
TUESDAY = 2
WEDNESDAY = 3
THURSDAY = 4
FRIDAY = 10
day = WeekDays.FRIDAY
print(day)
print(day.value)
print(day.name)
輸出結果:
WeekDays.FRIDAY
10
FRIDAY
4.限制枚舉類
爲了使枚舉常量成員只能是整數類型: enum.IntEnum作爲父類
防止常量重複: @enum.unique 裝飾器(如果常量重複報錯)
代碼示例:
import enum
@enum.unique #裝飾器
class WeekDay(enum.IntEnum): #只能是整數類型
#枚舉常量列表
MONDAY = 1
TUESDAY = 2
WEDNESDAY = 3
THURSDAY = 4
FRIDAY = 10
day = WeekDays.FRIDAY
print(day)
print(day.value)
print(day.name)
如果嘗試將其中的成員值修改爲非整數類型,或者修改相同值,則發生異常。
這次的分享到這裏,如有整理錯誤之處,留下寶貴意見。
希望自己早日脫離小白之稱·····