Python面向對象小總結

python類與面向對象

編程範式:面向過程,面向對象,函數式()

面向過程編程

使用指令告訴計算機,一步一步幹什麼,包含了一組步驟。top-down languages,把一個大問題分解為很多個小問題,小問題再分解。

問題:可能一部分與其他部分相互依賴,所以修改一部分可能會導致其他部分也要修改

如果只用一次性的使用,那麼久直接使用面向過程編程就可以了

面向對象編程

object oriented programming

利用類與對象創建模型來實現對真實事件的描述,世間萬物都可以分類,皆為對象

利用opp可以提高俠侶,讓別人更加容易理解代碼的邏輯,從而使團隊開發更加從容。

只要是對象一定屬於某種類

只要是對象就一定有屬性(功能)

面向對象的核心特性:

1. class 類:對一類具有相同屬性的對象的抽象,類中定義了這些對象的屬性,共同的方法

2. object 對象:一個對象是一個類的實例化後的實例,一個類必須經過實例化後方可在程序中調用,一個類可以實例化多個對象,每個對象亦可以有不同的屬性

3. 封裝: 不關心內部具體實現(相當於不關心血液在身體中怎麼流動)

4. 繼承: 一個類可以派生出子類,這個父類里定義的屬性,方法自動被子類繼承(兒子像父親)

5. 多態: 一個基類中派生出了不同的子類,每個子類在繼承了同樣的方法名的同時(我作為老闆發出工作的指令,下面員工作為抽象的東西,各個對象各司其職)

例子

class Dog:

def init(self,name): //只是為了傳名字

self.name = name

def bulk(self):

print(「%s: wang wang wang!」 % self.name)

簡介oop編程

oop相比於函數編程可以更容易的使程序

類的實例化:

把一個類變成一個具體對象的過程叫做類的實例化

相當於初始化一個類,造了一個對象

init的講解

class Role:

n=123#類變數

def init(self,name,…)

#構造函數

在實例化的時候做了一些類的初始化工作`

self.name = name #實例變數(靜態屬性),實例變數的作用域就是實例本身

def shoot(self):#類的方法,功能(動態屬性)

print("shooting:")

注意

正常情況:調用函數->執行->返回結果

而在對類進行實例化的時候並非進行生成對象然後返回地址,而是把r1直接傳過去,直接對r1進行操作,然後就不是返回地址的方式,self對應的就是變數名

init函數是不斷實例,copy的,但是類里的其他函數並不會copy很多分到其他地方

class Role(object):

def init(self,name,role,weapon,lifevalue=100,money=15000):

self.name = name

self.role = role

self.weapon = weapon

self.lifevalue = lifevalue

self.money = money

def shot(self):

print("shooting...")

def gotshot(self):

print("ah...,I got shot...")

def buygun(self,gunname):

print("just bought %s" %gunname)

r1 = Role(Alex,police,AK47』) #生成一個角色

r2 = Role(Jack,terrorist,B22』) #生成一個角色

因為buygun()函數並沒有複製,還是在類裡面,想調用方法還得到class裡面取,所以r1.buggun()還是相當於要把r1傳過去,所以class裡面的函數也要有self

類變數和實例變數的區別

在實例中調用的時候總是先找實例變數,沒有實例變數再找類變數

在實例中修改類變數,實際上是在r1的內存中加入了一個新的變數,變數名和類變數名相同。所以此時如果輸出其他實例中的類變數還是沒有變化

類變數的作用:大家公用的屬性

class Person:

cn = 「中國「

def init(self,name,age,addr):

self.name = name#實例變數,作用域就是實例本身

比較

class Person:

cn = 「中國「

def init(self,name,age,addr,cn="china"):

self.name = name

self.cn=cn

第一種方法比第二種方法節省內存空間

實例化的一些技巧

在實例化一個類之後,甚至可以給實例化的變數添加新的屬性

析構函數

在實例釋放,銷毀的時候執行的,通常用於做一些收尾工作,如關閉一些資料庫連接,打開的臨時文件

def __del__(self):#類的方法,功能(動態屬性)

print(「%s nb!」)

del在實例,對象被銷毀的時候執行(程序退出或者程序中間del)

封裝私有方法,私有屬性

私有屬性,在屬性前面加上兩個下劃線

class Role(object):

def init(self,name,role,weapon,lifevalue=100,money=15000):

self.name = name

self.role = role

self.weapon = weapon

self.__life_value= life_value#這就是私有屬性,從外面無法訪問,在類的內部可以訪問,要想訪問必須得在內部重新定義一個方法

self.money = money

def show_status(self):_

print("name: %s weapon: %s lifeval:%s" %(self.name,self.lifevalue))

私有方法:在方法前面加上兩個下劃線

def __del__(self):

...

繼承

作用:

class People:

def __init__(self,name,age):

self.name = name

self.age = age

def eat(self):

print(「%s is eating…」 %self.name)

怎麼繼承呢

class Man(People):

def eat(self):

print("%s",self.name)

上面這個是覆蓋了

如果想增加新功能怎麼辦

def eat(self):

People.sleep(self)

print("man is sleeping")

像這樣就重構了父類的方法

pass

這樣就直接繼承了

m1 = Man("liu",22)

如果兩個子類都是同一個父類的,但是不能互相共享各自獨特的方法

經典類class people:

新式類class people(object):

多繼承

一個類繼承多個父類

經典類:(python3 廣度優先,python2深度優先)

只需要在一個父類中實例化,其他父類中即使沒有實例化只有新功能也可以。

然後再python3中,實例化的時候會先檢查自己的函數,看看裡面是否有init函數,如果沒有會找到第一個父類函數中的init,如果還沒有,那麼再看看參數列表裡面的第二個父類函數中有沒有init函數,如果沒有再繼續找下一個

新式類(python3還是廣度優先,Python2廣度優先)

多態

一種介面,多種實現。

允許將子類類型的指針賦值給父類類型的指針

那麼,多條的作用是什麼呢?封裝是可以隱藏實現細節,使得代碼模塊化,繼承可以擴展已存在的代碼模塊。多態是為了實現另一個目的:一種介面,多個實現。


推薦閱讀:

Python 3.6 有什麼新特性?
selenium爬蟲被檢測到 該如何破?
Python3.6 Dtrace實戰
文件里寫的是unicode,用python怎麼讀取成文本?
Python中實現iterator

TAG:Python | 面向對象編程 |