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字典
利用簡書首頁文章標題數據生成詞雲

TAG:Python教程 | 函数式编程 | 大规模机器学习 |