熱線電話:13121318867

登錄
首頁大數據時代不會面向對象,肯定學不好Python!簡易的Python面向對象攻略來啦
不會面向對象,肯定學不好Python!簡易的Python面向對象攻略來啦
2021-04-20
收藏

來源:麥叔編程

作者:麥叔

前言

面向對象是所有高級語言(Python,Java,C++等)的基石,是重中之重。

這個文章系列的目的是通過簡單易懂的例子,深入淺出,讓Python學習者牢固的掌握Python面向對象的概念和方法。

本系列包括:

  • 面向對象(1) - 屬性,構造方法,self關鍵詞。
  • 面向對象(2) - 實例方法 (本文)
  • 面向對象(3) - 類屬性和類方法
  • 面向對象(4) - 繼承
  • 面向對象(5) - 吃雞游戲綜合練習
  • 面向對象(6) - 標準庫和第三方庫中的類

本文是第2篇,第1篇的鏈接請見本文最后。如果你還沒讀第一篇,強烈建議你去讀一讀。

不會面向對象,肯定學不好Python!簡易的Python面向對象攻略來啦

開場

一個類有屬性和方法。屬性是基本信息,而方法是行為。以人類為例,人類有姓名,年齡等屬性(基本信息),有吃飯,走路等行為,也可以把方法理解成能力。

這節課我們來給下面的類添加方法:

#類是一個模板 class Dog:     #構造方法     def __init__(self, name, height, power):
        self.name = name
        self.height = height
        self.power = power
        self.blood = 10 d1 = Dog('大黃'0.73#創建第1個實例 d2 = Dog('二黑'0.54#創建第2個實例 

這個類里面已經有一個方法了,就是__init__,這個方法被稱為構造方法,是用來創建Dog實例用的方法。

實例方法

狗會叫,我們來添加一個bark方法:

#類是一個模板 class Dog:     #構造方法     def __init__(self, name, height, power):         self.name = name
        self.height = height
        self.power = power
        self.blood = 10     def bark(self):         '''會說話的狗:會報出自己的名字,身高等信息'''         print(f'我是{self.name},身高{self.height}, 血量{self.blood},攻擊力{self.power}')

d1 = Dog('大黃'0.73#創建第1個實例 d2 = Dog('二黑'0.54#創建第2個實例 d1.bark()
d2.bark()
  • 其中bark方法最前面的三引號里是bark方法的注釋。
  • 這個一個實例方法,也就是說必須通過實例調用它,就是上面的d1,d2等實例變量。
  • 方法第一個變量必須是self,表示當前實例。但調用時不需要傳入,因為Python會自動傳入。

我們再來添加一個方法,就是第一節課中提到的attack方法:

    def attack(self, dog2):         '''當前Dog攻擊參數中指定的Dog,對方會減少和self.power相同的血量'''         dog2.blood = d2.blood - self.power

這個方法除了self參與外,還傳入了一個額外的參數。

通過方法來改變屬性

現在Dog的變量可以被外部的代碼直接訪問和修改。有時候我們希望加以控制,不希望別人可以隨便修改變量的值。

比如Dog的blood(血量)這個屬性,最小應該是0,而不應該出現負數。但如果有下面的代碼:

d2.blood = -10 

或者讓d1攻擊d2多次:

for i in range(5):
    d1.attack(d2)

都會出現d2.blood為負數的情況。這個不合理!

為了解決這個問題,我們做如下變動:

#類是一個模板 class Dog:     #構造方法     def __init__(self, name, height, power):         self.name = name
        self.height = height
        self.power = power
        self._blood = 10     def bark(self):         '''會說話的狗:會報出自己的名字,身高等信息'''         print(f'我是{self.name},身高{self.height}, 血量{self.blood},攻擊力{self.power}')

    def attack(self, dog2):         '''當前Dog攻擊參數中指定的Dog,對方會減少和self.power相同的血量'''         d2.reduce_blood(d1.power)
    
    def blood(self):         return self._blood

    def reduce_blood(self, reduce_value):         '''減少血量,減到0為止'''         if(reduce_value > self._blood):
            self._blood = 0         else:
            self._blood = self._blood - reduce_value


d1 = Dog('大黃'0.73#創建第1個實例 d2 = Dog('二黑'0.54#創建第2個實例 print(d2.blood()) for i in range(5):
    d1.attack(d2)

print(d2.blood())
  • 把blood變量改名為_blood,表示這是內部變量,外面不應該訪問。這只是一種約定,實際上外面還是可以訪問的。
  • 創建了reduce_blood()方法,用來減少血量,這里面會控制血量不能小于0。
  • 創建了blood()方法用來訪問內部的_blood變量。
  • 改寫了attack()方法,讓它也使用reduce_blood()方法,而不是直接改寫變量的值。

練習

我們已經學習了面向對象的基本知識,包括類,實例,屬性,方法,self等關鍵信息。

光說不練非好漢,現在是練習時間!請完成下面的類的定義。

1.汽車: 創建一個名為Car的類,其方法__init__() 設置兩個屬性:name和brand(品牌)。 定義一個名為show()的方法,功能是打印出汽車的名稱和品牌。 定義一個名為run()的方法,打印:汽車XX跑起來了。其中XX表示汽車的name. 根據這個類創建一個名為car的實例,先通過屬性直接打印其兩個屬性,再調用上面的兩個方法。 2. 5輛汽車: 根據在練習1而編寫的類創建5個實例,并對每個實例調用方法show方法。 3. Pig: 創建一個名為Pig的類,其中包含屬性name和weight 定義一個名為show()方法,打印Pig的基本信息; 再定義一個名為run() 的方法,打?。?XX: 沒吃過豬肉,讓你看看豬跑!'。 創建多個表示不同豬的實例,并對每個實例都調用上述兩個方法。 4 就餐人數: 在為完成練習1的Car類中,添加一個名為number_of_people的屬性,并將其默認值設置為0。添加一個名為max_people的屬性,表示車上最多可以有幾個人。修改相應的構造方法,傳入max_people的值。 添加一個名為set_people() 的方法,它讓你能夠設置車上的人數,但是不能超過max_people的限制。 添加一個名為increase_people()的方法,每次調用這個方法就會讓車上的人數加1,但是不能超過max_people的限制。 添加一個名為reduce_people()的方法,每次調用這個方法就會讓車上的人數減少1,但是最多減少為0. 根據這個類創建一個名為car的實例,先通過屬性直接打印其兩個屬性,再調用上面的兩個方法。;打印有多少人在車上,然后多次調用以上3個方法,并打印車上的人數。

數據分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數據分析師資訊
更多

OK
客服在線
立即咨詢
日韩人妻系列无码专区视频,先锋高清无码,无码免费视欧非,国精产品一区一区三区无码
客服在線
立即咨詢