面向對象編程python
面向對象編程是一種編程方式,此編程方式須要使用 「類」 和 「對象」 來實現,因此,面向對象編程其實就是對 「類」 和 「對象」 的使用。程序員
1 # 建立類 2 class Foo(object): #新式類(經典類 class Foo:) 3 4 def Bar(self): 5 6 print 'Bar' 7 8 def Hello(self, name): 9 10 print 'i am %s' %name 11 12 # 根據類Foo建立對象obj 13 14 obj = Foo() 15 16 obj.Bar() #執行Bar方法 17 18 obj.Hello('x54256') #執行Hello方法
面向對象3大特色:數據庫
1、封裝 編程
封裝,顧名思義就是將內容封裝到某個地方,之後再去調用被封裝在某處的內容。ide
因此,在使用面向對象的封裝特性時,須要:模塊化
1 class Foo(object): 2 def __init__(self,name,age): #構造函數,根據類建立對象時(實例化)自動執行 3 self.name=name 4 self.age=age 5 6 def run(): 7 print("%s今年%s歲了。"%(self.name,self.age) 8 9 10 #實例化(就是將內容封裝到某處) 11 #實際上alex和22被封裝到了obj1中,x54256和21被封裝到了obj2中 12 13 obj1=Foo('alex',22) 14 15 obj2=Foo('x54256',21) 16 17 18 #若要調用必須從obj1,obj2中調用封裝的內容 19 20 print(obj1.name) 21 print(obj2.name) 22 23 #要從被封裝的地方調用類中的函數 24 25 obj1.run() 26 obj2.run()
2、繼承函數式編程
繼承,面向對象中的繼承和現實生活中的繼承相同,即:子能夠繼承父的內容。函數
例如:post
貓能夠:喵喵叫、吃、喝、拉、撒spa
狗能夠:汪汪叫、吃、喝、拉、撒
若是咱們要分別爲貓和狗建立一個類,那麼就須要爲 貓 和 狗 實現他們全部的功能,以下所示:
1 class 貓: 2 3 def 喵喵叫(self): 4 print '喵喵叫' 5 6 def 吃(self): 7 # do something 8 9 def 喝(self): 10 # do something 11 12 def 拉(self): 13 # do something 14 15 def 撒(self): 16 # do something 17 18 class 狗: 19 20 def 汪汪叫(self): 21 print '喵喵叫' 22 23 def 吃(self): 24 # do something 25 26 def 喝(self): 27 # do something 28 29 def 拉(self): 30 # do something 31 32 def 撒(self): 33 # do something 34 35 僞代碼
上述代碼不難看出,吃、喝、拉、撒是貓和狗都具備的功能,而咱們卻分別的貓和狗的類中編寫了兩次。若是使用 繼承 的思想,以下實現:
動物:吃、喝、拉、撒
貓:喵喵叫(貓繼承動物的功能)
狗:汪汪叫(狗繼承動物的功能)
1 class 動物: 2 3 def 吃(self): 4 # do something 5 6 def 喝(self): 7 # do something 8 9 def 拉(self): 10 # do something 11 12 def 撒(self): 13 # do something 14 15 # 在類後面括號中寫入另一個類名,表示當前類繼承另一個類 16 class 貓(動物): 17 18 def 喵喵叫(self): 19 print '喵喵叫' 20 21 # 在類後面括號中寫入另一個類名,表示當前類繼承另一個類 22 class 狗(動物): 23 24 def 汪汪叫(self): 25 print '喵喵叫' 26 27 僞代碼
1 class Animal: 2 3 def eat(self): 4 print "%s 吃 " %self.name 5 6 def drink(self): 7 print "%s 喝 " %self.name 8 9 def shit(self): 10 print "%s 拉 " %self.name 11 12 def pee(self): 13 print "%s 撒 " %self.name 14 15 16 class Cat(Animal): 17 18 def __init__(self, name): 19 self.name = name 20 self.breed = '貓' 21 22 def cry(self): 23 print '喵喵叫' 24 25 class Dog(Animal): 26 27 def __init__(self, name): 28 self.name = name 29 self.breed = '狗' 30 31 def cry(self): 32 print '汪汪叫' 33 34 35 # ######### 執行 ######### 36 37 c1 = Cat('小白家的小黑貓') 38 c1.eat() 39 40 c2 = Cat('小黑的小白貓') 41 c2.drink() 42 43 d1 = Dog('胖子家的小瘦狗') 44 d1.eat()
3、多態
1 class Animal(object): 2 3 def __init__(self, name): # Constructor of the class 4 5 self.name = name 6 7 def talk(self): # Abstract method, defined by convention only 8 9 raise NotImplementedError("Subclass must implement abstract method") 10 11 class Cat(Animal): 12 13 def talk(self): 14 15 print('%s: 喵喵喵!' %self.name) 16 17 18 class Dog(Animal): 19 20 def talk(self): 21 22 print('%s: 汪!汪!汪!' %self.name) 23 24 25 def func(obj): #一個接口,多種形態 26 27 obj.talk() 28 29 30 c1 = Cat('小晴') 31 32 d1 = Dog('李磊') 33 34 35 func(c1) 36 37 func(d1)
領域模型
領域模型就是對需求所涉及的領域的一個建模,更通俗的講法是業務模型。 參考百度百科領域模型定義以下: (http://baike.baidu.cn/view/757895.htm )
從這個定義咱們能夠看出,領域模型有兩個主要的做用:
領域域建模的方法就是「從用例中找名詞」。 固然,找到名詞後,爲了可以更加符合面向對象的要求和特色,咱們還須要對這些名詞進一步完善,這就 是接下來的步驟:加屬性,連關係!
1.找名詞
who : 學員、講師、管理員
用例:
1. 管理員 建立了 北京 和 上海 兩個校區
2. 管理員 建立了 Linux \ Python \ Go 3個課程
3. 管理員 建立了 北京校區的Python 16期, Go開發第一期,和上海校區的Linux 36期 班級
4. 管理員 建立了 北京校區的 學員 小晴 ,並將其 分配 在了 班級 python 16期
5. 管理員 建立了 講師 Alex , 並將其分配 給了 班級 python 16期 和全棧脫產5期
6. 講師 Alex 建立 了一條 python 16期的 上課紀錄 Day6
7. 講師 Alex 爲Day6這節課 全部的學員 批了做業 ,小晴得了A, 李磊得了C-, 嚴帥得了B
8. 學員小晴 在 python 16 的 day6裏 提交了做業
9. 學員李磊 查看了本身所報的全部課程
10 學員 李磊 在 查看了 本身在 py16期 的 成績列表 ,而後自殺了
11. 學員小晴 跟 講師 Alex 表白了
名詞列表:
管理員、校區、課程、班級、上課紀錄、做業、成績、講師、學員
2.加屬性
3.連關係
有了類,也有了屬性,接下來天然就是找出它們的關係了。
總結
以上就是本節對於面向對象初級知識的介紹,總結以下:
問答專區
問題一:什麼樣的代碼纔是面向對象?
答:從簡單來講,若是程序中的全部功能都是用 類 和 對象 來實現,那麼就是面向對象編程了。
問題二:函數式編程 和 面向對象 如何選擇?分別在什麼狀況下使用?
答:須知:對於 C# 和 Java 程序員來講不存在這個問題,由於該兩門語言只支持面向對象編程(不支持函數式編程)。而對於 Python 和 PHP 等語言卻同時支持兩種編程方式,且函數式編程能完成的操做,面向對象均可以實現;而面向對象的能完成的操做,函數式編程不行(函數式編程沒法實現面向對象的封裝功能)。
因此,通常在Python開發中,所有使用面向對象 或 面向對象和函數式混合使用
面向對象的應用場景:
1.多函數需使用共同的值,如:數據庫的增、刪、改、查操做都須要鏈接數據庫字符串、主機名、用戶名和密碼
1 class SqlHelper: 2 3 def __init__(self, host, user, pwd): 4 5 self.host = host 6 self.user = user 7 self.pwd = pwd 8 9 def 增(self): 10 # 使用主機名、用戶名、密碼(self.host 、self.user 、self.pwd)打開數據庫鏈接 11 # do something 12 # 關閉數據庫鏈接 13 14 def 刪(self): 15 # 使用主機名、用戶名、密碼(self.host 、self.user 、self.pwd)打開數據庫鏈接 16 # do something 17 # 關閉數據庫鏈接 18 19 def 改(self): 20 # 使用主機名、用戶名、密碼(self.host 、self.user 、self.pwd)打開數據庫鏈接 21 # do something 22 # 關閉數據庫鏈接 23 24 def 查(self): 25 # 使用主機名、用戶名、密碼(self.host 、self.user 、self.pwd)打開數據庫鏈接 26 # do something 27 # 關閉數據庫鏈接# do something
2.須要建立多個事物,每一個事物屬性個數相同,可是值的需求
如:張3、李4、楊五,他們都有姓名、年齡、血型,但其都是不相同。即:屬性個數相同,但值不相同
1 class Person: 2 3 def __init__(self, name ,age ,blood_type): 4 5 self.name = name 6 self.age = age 7 self.blood_type = blood_type 8 9 10 def detail(self): 11 temp = "i am %s, age %s , blood type %s " % (self.name, self.age, self.blood_type) 12 print temp 13 14 zhangsan = Person('張三', 18, 'A') 15 lisi = Person('李四', 73, 'AB') 16 yangwu = Person('楊五', 84, 'A')
問題三:類和對象在內存中是如何保存?
答:類以及類中的方法在內存中只有一份,而根據類建立的每個對象都在內存中須要存一份,大體以下圖: