1. 面向對象和面向過程
面向對象和面向過程的理解:
-
⾯向過程: ⼀切以事物的流程為核⼼。 核⼼是"過程"⼆字, 過程是指解決問題的步驟,即:先⼲什么,后⼲什么。基於該思想編寫程序就好比在編寫⼀套流⽔線,是⼀種機械式的編程思維。
- 優點: 負責的問題流程化, 編寫相對簡單
- 缺點: 可擴展性差
-
⾯向對象: ⼀切以對象為中⼼.
什么是對象?事實上,我們身邊的事物都是對象,一個對象它有自己的屬性,它有自己的方法;就好像什么是⼈,有名字,年齡,愛好,會唱歌跳舞思考的是⼈。我們給這它下了⼀個簡單的定義,總結:具有相同屬性和動作的結合體叫對象
,⾯向對象思維,要⾃⼰建立對象,⾃⼰建立場景,你是就是⾯向對象世界中的上帝。- 優點: 可擴展性強
- 缺點: 編程的復雜度⾼於⾯向過程
2. 面向對象如何編寫:
- 首先,我們要創建一個類,創建類的語法很簡單:
class 變量名:
...
創建一個人的類:
class Person:
def __init__(self, name): # 構造方法,在類創建時就會執行
self.name = name
def speek(self): # Person類的一個方法
print(f'我是{self.name}') # 在這里可以使用self來訪問類中的屬性和方法
p = Person('ZZC') # 創建一個具體Person類的對象
p.speek() # 通過對象名.function()可以使用類的方法
# 結果:
# 我是ZZC
通常在編寫一個類的時候,會寫一個__init__
方法,它會在對象被創建的時候執行,這里也可以像使用函數一樣給函數傳遞變量(如例子中的Person('ZZC'))在實例化的時候會執行並接受這個參數。
注意:關於self:
- 這里我們可以看到,
__init__
和speek
方法都會接收一個self
的參數,但是我們在傳參的時候並沒有手動傳參給函數,這是因為解釋器會自動把self
參數幫我們傳遞給對象的方法self
其實就是實例本身:那個對象調用了這個方法,那個對象就是self
3. 面向對象的三大特征
了解過面向對象編程的都知道,面向對象的三大特征:封裝、繼承、多態。
封裝
把很多數據封裝到⼀個對象中,把固定功能的代碼封裝到⼀個代碼塊,函數,對象, 打包成模塊,這都屬於封裝的思想,具體的情況具體分析。在⾯向對象思想中,是把⼀些看似⽆關緊要的內容組合到⼀起統⼀進⾏存儲和使⽤. 這就是封裝.
class Person:
def __init__(self, name, age, gender): # 把屬性都封裝在self里面
self.name = name
self.age = age
self.gender = gender
def eat(self):
print(f'{self.name}正在吃飯')
obj1 = Person('孫福來', 18, '女') # 實例化一個類,得到一個對象
print(obj1.age) # 要訪問類的屬性都需要通過對象來訪問
obj.eat() # 要執行類中的方法也要通過類來訪問
繼承
一個類在定義的時候可以繼承自其他的類,繼承的類默認擁有其父類的屬性和方法。在python中實現繼承非常簡單. 在聲明類的時候, 在類名后⾯添加⼀個⼩括號,就可以完成繼承關系。
class A:
def func1(self):
print('這是fun1函數')
class B(A):
pass
b = B()
b.func1() # 打印: 這是fun1函數
那么什么情況可以使⽤繼承呢? 單純的從代碼層⾯上來看. 兩個類具有相同的功能或者特征的時候. 可以采⽤繼承的形式. 提取⼀個⽗類, 這個⽗類中編寫着兩個類相同的部分. 然后兩個類分別取繼承這個類就可以了. 這樣寫的好處是我們可以避免寫很多重復的功能和代碼.
class DBUtil:
def __init__(self, host, port, username, passwd):
self.host = host
self.port = port
self.usernam = username
self.passwd = passwd
def connetc(self):
pass
def close(self):
pass
class MysqlUtil(DBUtil):
def inser(self):
pass
def delete(self):
pass
def update(self):
pass
def select(self):
pass
class RedisUtil(DBUtil):
def inser(self):
pass
def delete(self):
pas
def update(self):
pass
def select(self):
pass
如上,假設我們要編寫一個操作數據庫的工具,那么就可以把一些公共的功能都寫在父類中,對於具體的數據庫操作實現都放在子類中,那樣就可以避免編寫多余的重復代碼。
在python中還可以繼承自多個類,在繼承多各類時查找父類中的屬性有一定的順序,具體的順序是基於MRO c3算法來計算的,關於這一塊后面再補上。
多態
同⼀個對象,多種形態。多態在python中體現的並不是很明顯,我們通過例子來看:
class Animal:
def eat(self):
print('這只動物正在吃,瘋狂的吃')
class Cat(Animal):
def eat(self):
print(f'貓正在吃')
class Dog(Animal):
def eat(self):
print(f'狗正在吃')
class Tiger(Animal):
pass
class Watch:
def func(self, obj):
obj.eat()
c = Cat()
d = Dog()
t = Tiger()
w = Watch()
w.func(c) # 貓正在吃
w.func(d) # 狗正在吃
w.func(t) # 這只動物正在吃,瘋狂的吃
在上面的例子中,我們通過Watch
類創建出的對象w
來執行各種動物的eat
方法,這個方法要接收一個參數,即把各個動物的對象傳進去,然后執行對象中的eat
方法,而這個方法只要接收的對象擁有eat
方法,那么就可執行這個eat
方法,因此只要保證傳入進來的對象中有這個方法,就能夠正常運行。這就是同⼀個對象,多種形態的表現;在python中,多態是鴨子模式的一種體現。
多態的好處: 程序具有超⾼的可擴展性. ⾯向對象思想的核⼼與靈魂. python⾃帶多態