Python面向對象編程(OOP)
寫在最前:
Python的厲害之處就不多說了,在機器學習的技能圖譜中,Python屬於地基層面。為此,多花些時間,把Python基礎打牢固,是為將來的職業路徑中走得更遠更穩。
該Python基礎筆記是七月學員clownfish對機器學習集訓營一期中Python部分的整理,共分為四篇,1. Python環境配置及基礎數據類型,2. 控制循環,與函數,3.面向對象,4.內置模塊(os,文件,正則等)與第三方庫(requests等)的應用
知識點
類class
類是對一類事物的抽象。比如汽車,門,貓。
Python中, 類(class)的變數是所有對象共享使用, 只有一個拷貝, 所有對象修改, 都可以被其他對象所見;
對象(object)的變數由類的每個對象所擁有,每個對象都包含自己的一份拷貝, 不會影響其他對象;
之前學習的都是Python自帶的數據類型,class則是我們自己定義的類型。
對象object
某類事物中的一個具體的實例,對應類。如果我家的那輛汽車,張偉辦公室的大門,隔壁麗麗家的那隻小花貓。
類與對象的關係
類就像是對象的模板,可以批量生產出許多的對象。
好比下面a這個變數其實是整形數字int類的一個實例,那int這個類還可以』復刻』出許許多多的整形對象。這些對象共有的特徵就是:整數性。
__init__函數
類中的構造函數,用以在初始化對象時使用。
self,cls關鍵字
self是指向每個獨立對象的指針.在實例方法中第一個形參被命名為 self,以區別其它函數。
cls是指向類的指針,在類方法中第一個形參要命名為cls.
類內部的不同類型方法
實例方法:
是指該類的每個實例都可以調用到的方法。只有實例能調用實例方法。定義時第一個形參為self
類方法:
類方法是將類本身作為對象進行操作的方法。類對象和實例都可以調用類方法。定義時以@classmethod進行裝飾,其第一個參數是類,約定寫為cls。
實例方法和類方法都是依賴於python的修飾器來實現。 對象方法以self參數,類方法以cls參數來傳遞。
靜態方法:
可以認為靜態方法是一種存在在類中普通函數,不會對任何實例類型進行操作,類對象和實例都可以調用靜態方法,定義時以@staticmethod進行聲明。
類變數和實例變數
類變數定義在類的內部,像普通變數一樣定義即可。用 類名.變數名 直接去訪問。實例也能訪問類變數
實例變數則是以self.開頭,僅供各個實例對象
封裝
封裝就是將抽象的數據(變數)和行為(函數)打包,形成一個邏輯上的整體(即類);
封裝可以增強安全性(數據)並簡化編程(函數),用戶只能通過類對外介面的訪問許可權來使用類的成員。
繼承
一個類可以以 class newclsname():來開始全新構造(實際上會默認繼承自object);也可以從某個已經存在的類繼承。繼承的類叫做subclass。
比如要構造蜘蛛這個類,可以從昆蟲這個類繼承。構建學生,僱員,戰士都可以從人這個類繼承。
繼承的語法形式為:
class 類名(父類)
子類可以繼承父類的所有方法和屬性,也可以重載父類的成員函數及屬性
多態
因為類具有繼承關係,子類可以向上轉型被看做是父類的類型,比如無論是戰士還是快遞員,都是人類。
也因為有了繼承關係,子類可以繼承父類的所有方法和屬性,當然也可以重載父類的成員函數及屬性。例如,當子類(直升機)和父類(飛機)都存在相同的fly()方法時,子類的fly()覆蓋了父類的fly(),在運行時就總是會調用子類的fly()。這就是繼承帶來的多態。
super()
在子類中如果想調用父類中的方法,就需要使用super()方法。
實驗
創建一個最簡單的類
class employee(object):
def __init__(self,name,ID,title,salary,manager=None):
self.name=name
self.ID=ID
self.title=title
self.salary=salary
self.manager=manager
july=Employee(july,1,CEO,888888888)
創建類要使用class關鍵字。後面跟著的是類名employee,括弧內部可以為空(默認自object),也可以寫上其繼承的父類名。
__init__為類的構造函數,第一個參數self為保留關鍵字,代表指向該實例。其後為初始化Employee類實例時的傳入參數,
self.name及後邊的語句,為指定該Employee類的實例對象july中的變數名name為初始化實例時傳入的July。
接下來為創建該類的一個對象。方法很簡單
,這裡的july就是employee這個類的一個實例對象的名字了。
我們也可以這樣看下這兩者的對應關係。
創建有實例函數的類
class employee(object):
def __init__(self,name,ID,title,salary,manager=None):
self.name=name
self.ID=ID
self.title=title
self.salary=salary
self.manager=manager
def getinfo(self):
return Employee Name:{}, ID:{}, Title:{},.format(self.name,self.ID,self.title)
july=employee(july,1,CEO,888888888)
july.getinfo()
導入模塊module說明
把以上的代碼保存成Employee.py結尾的文件,放置在python可搜索到的路徑下,模塊的搜索路徑可以使用import sys;sys.path變數來查看。py文件就是一個模塊,就可以使用import classes來直接導入這個employee這個類了。
三種不同的導入模塊的寫法:
import Employee
from Employee import employee
from Employee import *
第一行的寫法是導入Employee這個module,如果要調用這個module下的某個類,需要使用Employee.employee這樣的格式。
第二行的寫法是從Employee這個module中導入employee這個類
第三行的寫法是從Employee這個module中導入所有對象
創造一個company類,並保存為Company.py
class company(object):
def __init__(self,name,employees=[]):
self.name=name
self.employees=employees
def hire(self,employee):
if not employee in self.employees:
print(adding ,employee , to ,self.name)
self.employees.append(employee)
else: print(employee, is already exists)
def fire(self,employee):
if employee in self.employees:
print(Firing ,employee , from ,self.name)
self.employees.remove(employee)
else: print(employee,is not in this company )
def getInfo(self):
print({},has employee:{}.format(self.name,self.employees))
最後創建一個main.py,導入前兩個類
from Employee import employee
from Company import company
if __name__==__main__:
july=employee(july,1,CEO,888888888)
print(july.getinfo())
hanxiaoyang=employee(xiaoyang,2,lecturer,1)
julyedu=company(julyedu.com)
julyedu.hire(july)
julyedu.hire(hanxiaoyang)
julyedu.fire(hanxiaoyang)
print(julyedu.getInfo())
用dir命令來inspect一個object
一個對象內部具體有些什麼,我們可以用dir(objectname)來觀察。
類的承繼
class person(object):
def __init__(self,name,ID):
self.name=name
self.ID=ID
def get_info(self):
return name:{}.format(self.name)
class student(Person):
def __init__(self,name,ID,level=0):
super().__init__(name,ID)
self.level=level
def get_info(self):
return {}, level: {}.format(super().get_info(),self.level)
def take_exam(self,grade):
if grade.upper() in [A,B,C]:
self.level+=1
return self.level
def graduate(self):
super().get_info()
if self.level>=12:
print(you have graduated from julyedu.com)
else:
print(failed, you have to finish {} scores to graduate.format(12-self.level))
#使用
jack=student(david,1,0)
jack.get_info()
for i in range(12):
jack.take_exam(A)
jack.graduate()
推薦閱讀:
※PyQt5系列教程(11):今天的消息挺全哦!
※如何系統的自學Python?
※給妹子講python--01好用的列表
※Python入門 數據結構 dict字典
※利用簡書首頁文章標題數據生成詞雲