python學習筆記:第15天 初識面向對象


1. 面向對象和面向過程

面向對象和面向過程的理解:

  1. ⾯向過程: ⼀切以事物的流程為核⼼。 核⼼是"過程"⼆字, 過程是指解決問題的步驟,即:先⼲什么,后⼲什么。基於該思想編寫程序就好比在編寫⼀套流⽔線,是⼀種機械式的編程思維。

    • 優點: 負責的問題流程化, 編寫相對簡單
    • 缺點: 可擴展性差
  2. ⾯向對象: ⼀切以對象為中⼼.
    什么是對象?事實上,我們身邊的事物都是對象,一個對象它有自己的屬性,它有自己的方法;就好像什么是⼈,有名字,年齡,愛好,會唱歌跳舞思考的是⼈。我們給這它下了⼀個簡單的定義,總結: 具有相同屬性和動作的結合體叫對象,⾯向對象思維,要⾃⼰建立對象,⾃⼰建立場景,你是就是⾯向對象世界中的上帝。

    • 優點: 可擴展性強
    • 缺點: 編程的復雜度⾼於⾯向過程

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⾃帶多態


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM