##############面向對象程式設計################
一 程式設計範式
面向對象程式設計——Object Oriented Programming,簡稱 OOP,把對象作為程式的基本單元,一個對象包含了資料和操作資料的函數。
面向過程把函數繼續切分為子函數,來降低系統的複雜度。
二 基礎概念
類: 在 Python 中,所有資料類型都可以視為對象,當然也可以自定義對象。自定義的對象資料類型就是面向對象中的類(Class)。
OOP首選思考的不是程式的執行流程,而是某個資料類型應該被視為一個對象,這個對象擁有的屬性(Property)。
方法: 給對象發消息實際上就是調用對象對應的關聯函數,我們稱之為對象的方法(Method)。
三 類
class Animals(object): ###定義類,object頂級類
def __init__(self,name,age): ###構造函數,後面跟你要傳遞的參數
self.name = name
self.age = age
def eating(self): ####方法,與函數唯一的差別是self
print "%s is eating ....." %self.name
def drink(self):
print "%s is drinking ....." %self.name
fentiao = Animals('fentiao',5) ######執行個體化
fentiao.eating()
fentiao.drink()
Class 是一種抽象概念,比如我們定義的 Class——Animals,是指動物這個概念;
執行個體()則是一個個具體的 Animals;
面向對象的抽象程度又比函數要高,因為一個 Class 既包含資料,又包含操作資料的方法。
object表示該類是從哪個類繼承下來的。通常,如果沒有合适的繼承類,就使用 object 類,這是所有類最終都會繼承的類。
建立執行個體的方式:fentiao = Animals('fentiao',5)
可以自由地給執行個體變量綁定屬性,fentiao.name fentaio.age
可定義一個特殊的 __init__ 方法,在建立執行個體的時候,就把name , age等屬性綁上去
__init__ 方法的第一個參數永遠是 self ,表示建立的執行個體本身;
在類中定義的函數隻有一點不同,就是第一個參數永遠是執行個體變量self ,并且調用時,不用傳遞該參數。
四 資料封裝
資料和邏輯被“封裝”起來了,調用很容易,但卻不用知道内部實作的細節。
封裝的另一個好處是可以給類增加新的方法;
class Animals(object): # 定義類
cn = 'china' #類變量
def __init__(self,name,age,gender): #構造函數,後面跟你要傳遞的參數,執行個體過程中執行的操作
self.name = name # self就是執行個體化的變量名,self.name是執行個體化屬性,靜态屬性
self.__gender = gender #以雙下劃線開頭的變量名,稱為私有變量或屬性
def eating(self): #方法,與函數唯一的差別是self,動态屬性
print '%s is eating.....'%self.name
def drink(self):
print '%s is drinking......' %self.name
def get_gender(self):
self.__hello()
return self.__gender
def __hello(self): # 私有方法
print 'hello.....'
class Cat(Animals):
pass
fentiao = Animals("fentiao",5,'male')
fentiao.__hello()
五 通路限制
在 Python 中,執行個體的變量名如果以 __ 開頭,就變成了一個私有變量(private);
雙下劃線開頭的執行個體變量是不是一定不能從外部通路呢?NO
class Animals(object):
def __init__(self,name,age,gender):
self.__gender = gender
def eating(self):
return "%s is %s ....." %(self.name,self.__gender)
fentiao = Animals('fentiao',5,'male')
print fentiao._Animals__gender
fentiao.__gender = 'female'
print fentiao.__gender
<a href="https://s5.51cto.com/wyfs02/M02/9B/EF/wKioL1lo5MHxkaVZAAGfbulX_VQ653.png-wh_500x0-wm_3-wmp_4-s_1643857147.png" target="_blank"></a>
六 繼承和多态
class Animal(object):
def run(self):
print 'Animal is running...'
class Dog(Animal):
pass
class Cat(Animal):
對于 Dog 來說,Animal 就是它的父類,對于 Animal 來說,Dog 就是它
的子類;
繼承最大的好處是子類獲得了父類的全部功能。
繼承的另一個好處:多态。子類的覆寫了父類的方法。
(1)
def __init__(self,name,age,):
print "%s is eating fish ....." %self.name
class Dog(Animals):
print "%s is eating gutou ....." %self.name
a1=Animals('animals1',2)
a1.eating()
a1.drink()
c1=Cat('cat1',5)
c1.drink()
c1.eating()
d1=Dog('dog1',4)
d1.eating()
d1.drink()
(2)
def __init__(self,name,age,color):
Animals.__init__(self,name,age)
self.color = color
print "%s is eating fish ....." %(self.name)
def info(self):
print """
cat info
name:%s
age:%d
color:%s
"""%(self.name,self.age,self.color)
c1 = Cat('cat1',5,'black')
c1.info()
<a href="https://s4.51cto.com/wyfs02/M00/9B/F0/wKiom1lo5MKTr2upAAFYqduqbZ4700.png-wh_500x0-wm_3-wmp_4-s_4260342672.png" target="_blank"></a>
七 擷取對象資訊
使用 type();
使用 isinstance();
使用 dir()
#####加了結束程序
def __del__(self): # 資料庫斷開
print "that's all,game over"
class Realtion(object):
def make_friend(self,obj):
print "%s is %s friend" %(self.name,obj.name)
class Cat(Animals,Realtion):
class Dog(Animals,Realtion):
print "%s is eating gutou ....." %(self.name)
c1 = Cat('tangmu',5,'black')
d2 = Dog('jieke',3)
c1.make_friend(d2)
<a href="https://s5.51cto.com/wyfs02/M00/9B/EF/wKioL1lo5MPQtxIhAAEdbAx0FKA933.png-wh_500x0-wm_3-wmp_4-s_3111708766.png" target="_blank"></a>
本文轉自 如何何如 51CTO部落格,原文連結:http://blog.51cto.com/12778805/1947736,如需轉載請自行聯系原作者