顯示具有 Python::物件導向 標籤的文章。 顯示所有文章
顯示具有 Python::物件導向 標籤的文章。 顯示所有文章

2021年7月5日 星期一

類別的定義與物件的使用

學習目標:
  • 了解 Python 類別的定義與物件的使用方式!

類別定義與實作:
  1. 類別定義規則:
    class 類別名稱:
        定義屬性 #其實就是定義變數名稱
        
        def 方法名稱:
            # 以下就是寫出要做的事
    
    PS: __init__(): 類別被呼叫而產生物件時,一開始需要設定的參數內容,亦即物件的初始化方法
           self: 物件呼叫自己的自我代稱詞!
           __屬性名稱: 表示這是私人的變數,不給外人使用!
           __方法名稱: 表示這是私人的方法,不給外人使用!
           注意縮排:縮排表示程式區塊!
  2. 類別實作範例,Car.py:
    class Car:
        color = ""
        mark = ""
        
        def setColor(self,color):
            self.color = color
    
        def setMark(self,mark):
            self.mark = mark
            
    if __name__ == "__main__":    
        myCar = Car()
        myCar.setColor("Red")
        myCar.setMark("Benz")
    
        print("車子的顏色:", myCar.color)
        print("車子的品牌:", myCar.mark )
    
  3. 另一種類別實作範例,Area.py:
    class Area:
    
        # 建構子
        def __init__(self,radius):
            self.radius = radius
            self.PI = 3.141592
            self.area = 0
            
        # 定義方法
        def getArea(self):
            self.area = self.radius * self.radius * self.PI
            return self.area
    
  4. 使用類別範例,demo.py:
    # 引用類別
    import Area
    import Car
    
    if __name__ == "__main__":
    
        # 不要忘記類別的引用方式
        circuleArea = Area.Area(10)
        print("圓面積:",circuleArea.getArea())
        
        myCar = Car.Car()
        myCar.setColor("White")
        myCar.setMark("BMW")
    
        print("車子的顏色:", myCar.color)
        print("車子的品牌:", myCar.mark )
        
    
    • 程式可能會有「單獨執行」與「被引用」兩種情形
    • 加上 __name__ == '__main__' 的判斷可讓檔案在被引用時,不該執行的程式碼不被執行
    • __name__是python中內建、隱含的變數,不必宣告即可用
    • 當程式是直接執行時,__name__的值就是__main__
    • 當程式是被引用時,__name__的值即是模組名稱
修改遊戲的主程式:
  1. 實作玩家類別 Player.py:
    class Player:
        # 初始化玩家,每人發 20000 遊戲幣以及出發位置為 0
        def __init__(self,money = 20000, po = 0):
            self.__money = money
            self.__po = po
            
        # 設定玩家名稱
        def setName(self,name):
            self.__name = name
            
        # 取得玩家名稱
        def getName(self):
            return self.__name
            
        # 修改玩家遊戲幣
        def setMoney(self,money):
            self.__money += money
            
        # 取得玩家遊戲幣
        def getMoney(self):
            return self.__money
            
        # 修改玩家位置
        def setPo(self,move):
            self.__po += move
            
        # 取得玩家位置
        def getPo(self):
            return self.__po
    
  2. 修改程式主程式 main.py:
    # 引用 random 類別中的 randrange() 函數
    from random import randrange
    
    # 引用 Player 物件
    import Player
    
    # 使用 if __name__
    if __name__ == "__main__":
    
        # 要求玩家要輸入遊戲人數
        players_num = eval(input("請輸入玩家人數:"))
    
        # 建立玩家物件
        players = []
    
        # 按照遊戲人數,使用 Player 類別
        # 逐次產生玩家名稱、玩家代號、玩家初始遊戲幣、玩家初始位置等物件內容
        for i in range(players_num):
            players.append(Player.Player())
            # 要求玩家輸入玩家名稱
            players[i].setName(input("請輸入玩家名稱:"))
            
    
        # 輸出資料
        for i in range(players_num):
            print(players[i].getName())
            print(players[i].getPo())
            print(players[i].getMoney())
    
        # 設定玩家順序值
        i = 0
    
        # 開始進行遊戲
        while True:    
        ##### a.)
        ##### b.) 擲骰子
            newstep = randrange(1,6)
            print(players[i].getName() + "擲骰子:" + str(newstep) + " 點")
            print(players[i].getName() + "前進中...")
            # 設定玩家新的位置
            players[i].setPo(newstep)
        ##### c.)移動到骰子點數的框格
        ##### e.)
            # 輪至下一位玩家
            if (i < players_num):
                i = i + 1
            else:
                i = i - players_num
    
            players_num = players_num - 1 # 測試 while 迴圈用
            print(players_num)
            
        ##### f.) 結束遊戲條件
            if (players_num <= 1):
                print("遊戲結束")
                break
    
參考文獻:

2021年7月4日 星期日

類別的引用

學習目標:
  • 了解 Python 類別引用與類別方法的使用方式!

類別引用方式:
  1. 使用指令模式,利用 import 來引用 random 類別:
    >>>import random
    >>>random.random()
    
    PS:產生一個大於等於0,但小於1的小數!
  2. 使用指令模式,使用 random 類別的其它幾個常見亂數函數(1):
    >>>import random
    >>>random.randrange(3)
    1
    >>>random.randrange(1,7)
    3
    >>>random.randrange(1,9,2)
    3
    
    PS: random.randrange(stop)、random.randrange(start,stop)、random.randrange(start,stop,step),其中的 stop 是永遠不會產生的數字!
  3. 使用指令模式,使用 random 類別的其它幾個常見亂數函數(2):
    >>>import random
    >>>random.randint(1,6)
    1
    >>>nums = [1,2,3,4,5,6]
    >>>random.choice(nums)
    3
    >>>random.shuffle(nums)
    >>>print(nums)
    [4, 1, 3, 2, 6, 5]
    
    PS: random.randint(a,b): 產生一個大於等於a,但小於等於b 的整數!  random.choise(a): 從 a 這個陣列中,隨機取一個整數值!  random.shuffle(a): 將 a 這個陣列隨機重新排列!
修改遊戲主要程式內容:
  • 修改程式內的迴圈內容:main.py
    # 引用 random 類別中的 randrange() 函數
    from random import randrange
    
    # 要求玩家要輸入遊戲人數
    players_num = eval(input("請輸入玩家人數:"))
    
    # 設定一開始的遊戲幣
    moneys = []
    
    # 設定玩家名單
    players_name = []
    
    # 按照遊戲人數,輸入玩家名稱,以及增加遊戲幣數量
    for i in range(players_num):
        # 要求玩家輸入玩家名稱
        players = input("請輸入玩家名稱:")
        # 將玩家名稱列入玩家資料陣列
        players_name.append(players) 
        # 增加遊戲幣數量
        moneys.append(20000) 
    
    # 輸出資料
    print(players_name[0])
    print(moneys[0])
    
    # 設定玩家順序值
    i = 0
    
    # 開始進行遊戲
    while True:    
    ##### a.)
    ##### b.) 擲骰子
        newstep = randrange(1,6)
        print(players_name[i] + "擲骰子:" + str(newstep) + " 點")
        print(players_name[i] + "前進中...")
    ##### c.)
    ##### e.)
        # 輪至下一位玩家
        if (i < players_num):
            i = i + 1
        else:
            i = i - players_num
    
        players_num = players_num - 1 # 測試 while 迴圈用
        print(players_num)
        
    ##### f.) 結束遊戲條件
        if (players_num <= 1):
            print("遊戲結束")
            break
    

2016年7月25日 星期一

Python 隱藏物件的屬性

Python 隱藏屬性的方法
  • 將屬性元素隱藏的好處如下:
    • 外部程式只能使用公開的屬性,避免內部元素被濫用!
    • 限制程式設計師必須要遵守已制定的規範,避免開發過程混亂!
  • 可參考前一篇文章!
  • Python 隱藏屬性的基本格式:
    class 類別名稱():
        
        def 方法名稱(給定值名稱):
           self.__變數名稱 = 給定值名稱
             :
             :
    
    
快速測試:
  1. 修改 human.py 的內容:
    #vim human.py
    class Human():
    
      def __init__(self):
        self.__name = "I am a human"
    
      def showName(self):
        return self.__name
    
      def eat(self):
        print("eating food ...")
    
    
  2. 修改 asian.py 的內容:
    #vim asian.py
    from human import Human
    
    class Asian(Human):
       def __init__(self,name):
          super().__init__()
          self.__name = super().showName()+ "\n" + "I am a Asian!" + name
    
       def showName(self):
          return self.__name
    
       def eat(self):
          print("eating rise food ...")
    
    
  3. 修改 runprogram.py 的內容:
    #vim runprogram.py
    from asian import Asian
    from american import American
    
    peter = Asian("Peter")
    print(peter.showName())
    print(peter.__name)
    peter.eat()
    
    
  4. 執行程式:
    #python3 runprogram.py
    I am a human
    I am a Asian!Peter
    Traceback (most recent call last):
      File "runprogram.py", line 6, in 
        print(peter.__name)
    AttributeError: 'Asian' object has no attribute '__name'
    
    

Python 的覆寫方法與 super 應用

類別覆寫方法結構
  • 方法的覆寫,是利用物件導向的繼承功能來報成!好處如下:
    • 可開發相同名稱,但功能不一定同於父類別的方法程式!
    • 可任意擴充或縮限父類別的方法,免於被父類別的方法所限制!
    • 利用 super ,可善用父類別內的方法!
  • 可參考前一篇文章!
  • Python 覆寫方法的基本格式:
    class 類別名稱():
        def 方法名稱(屬性名稱[,...]):
           執行程式內容
             :
             :
    
    class 子類別名稱(父類別名稱):
        def 同於父類別的方法名稱(屬性名稱[,...]):
           super().父類別的方法名稱
           執行不同於父類別的程式內容
             :
             :
    
快速測試:
  1. 修改 human.py 的內容:
    #vim human.py
    class Human():
      def __init__(self):
        self.name = "I am a Human"
    
      def showName(self):
        return self.name
    
      def eat(self):
        print("eating food ...")
    
    
  2. 修改 asian.py 的內容:
    #vim asian.py
    from human import Human
    
    class Asian(Human):
       def __init__(self,name):
          super().__init__()
          self.name = super().showName()+ "\n" + "I am a Asian!" + name
    
       def showName(self):
          return self.name
    
       def eat(self):
          print("eating rise food ...")
    
    
  3. 修改 runprogram.py 的內容:
    #vim runprogram.py
    from asian import Asian
    from american import American
    
    peter = Asian("Peter")
    print(peter.showName())
    peter.eat()
    
    
  4. 執行程式:
    #python3 runprogram.py
    I am a Human
    I am a Asian!Peter
    eating rise food ...
    

Python 的類別繼承結構

類別繼承結構
  • 繼承是物件導向重要精神,特徵如下:
    • 免於重複開發相同程式碼
    • 善用已開發好的類別物件!
  • Python 類別繼承基本格式:
    class 子類別名稱(父類別名稱):
        def 方法名稱(屬性名稱[,...]):
           執行程式內容
             :
             :
    
快速測試:
  1. 使用互動式指令:
    #python3
    Python 3.4.3 (default, Jan 26 2016, 02:25:35)
    [GCC 4.8.5 20150623 (Red Hat 4.8.5-4)] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>>
    
  2. 產生一個父類別 Car():
    >>> class Car():
    ...   def __init__(self):
    ...     print("I am a car !")
    ...
    
  3. 產生一個子類別 sedan(Car):
    >>> class Sedan(Car):
    ...   pass
    ...
    
  4. 產生一個 Car 物件以及 Sedan 物件:
    >>> myCar = Car()
    I am a car !
    >>> mySecCar = Sedan()
    I am a car !
    >>>
    
利用檔案測試:
  1. 編寫一個 Human() 類別:
    #vim human.py
    class Human():
      def __init__(self):
        self.name = "Human"
    
  2. 編寫一個 Asian() 類別,繼承 Human 類別:
    #vim asian.py
    from human import Human
    
    class Asian(Human):
       def __init__(self,name):
          self.name = name
       def showName(self):
          return self.name
    
  3. 編寫一個可執行程式:
    #vim  runprogram.py
    from asian import Asian
    
    peter = Asian("Peter")
    print(peter.showName())
    
  4. 執行程式:
    #python3  runprogram.py
    (執行結果)
    Peter
    

2016年7月20日 星期三

Python 的類別與物件

類別基本結構
  • 類別是物件產生的基本樣本,裡面包含了兩種元素:
    • 屬性:如同變數名稱
    • 方法:如同函式
  • Python 類別基本格式:
    class 類別名稱():
        def 方法名稱(屬性名稱[,...]):
           執行程式內容
             :
             :
    
  • Python 產生物件的基本方式:
    物件名稱 = 類別名稱(變數名稱)
    
    #物件名稱是自己命名的!
    #類別名稱必需要符合 class 的定義!
    #變數名稱需要有指定值!
    
  • Python 物件內屬性與方法的基本使用方式:
    #呼叫物件的某個屬性值:
    物件名稱.屬性名稱
    
    #使用物件的某個方法:
    物件名稱.方法名稱
    

快速測試:
  1. 使用互動式指令:
    #python3
    Python 3.4.3 (default, Jan 26 2016, 02:25:35)
    [GCC 4.8.5 20150623 (Red Hat 4.8.5-4)] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>>
    
  2. 建立一個 person 類別,並且將定義 name 屬性與 list_name 方法:
    >>> class person():
    ...   def __init__(self,name):
    ...     self.name = name
    ...   def list_name():
    ...     return self.name
    ...
    
  3. 產生 person 物件,並且列出名字:
    >>> peter = person("Peter")
    >>> print(peter.name)
    Peter
    >>>
    >>>quit()
    $
    
  4. 利用編寫 python 程式檔:
    $vim human.py
    class Human():
      def __init__(self,name):
         self.name = name
      def list_name(self):
         return self.name
    
    peter = Human("Peter")
    print(peter.list_name())
    
  5. 執行 python 程式檔:
    $python3 human.py
    Peter