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