1. 程式人生 > >python的類和物件2(self引數)

python的類和物件2(self引數)

python的類和物件2(self引數)

1、python裡面物件的方法都會有self引數,它就相當於C++裡面的this指標;繫結方法,據說有了這個引數,Python 再也不會傻傻分不清是哪個物件在呼叫方法了,你可以認為方法中的 self 其實就是例項物件的唯一標誌

2、__init__(self)稱作:魔法方法,類在例項化以後會主動進行呼叫

舉例如下:

3、在python程式設計裡面類的定義裡面,類的屬性一般可以分為私有和共有兩大類,對於一般的屬性定義都是指類的共有屬性,可以被外界直接訪問,而私有屬性是在類的屬性前面加上兩個下劃線,對於私有屬性的訪問外界不可以直接訪問,私有屬性其實在python程式設計裡面將其定義為了:_類名__屬性

,可以直接訪問它就可以訪問到私有屬性

    __name=“燕江依”

例如如下:

class Person2:

   __name="yjy"

執行結果如下:


4、我們把getName方法稱之為“訪問器”。Python事實上是採用一種叫“name mangling”技術,將以雙下劃線開頭的變數名巧妙的改了個名字而已,我們仍然可以在外部通過“_類名__變數名”的方式訪問

5、我們常說的類指的是類定義,由於“Python無處不物件”,所以當類定義完之後,自然就是類物件在這個時候,你可以對類的屬性(變數)進行直接訪問(MyClass.name)。

一個類可以例項化出無數的物件(例項物件),Python 為了區分是哪個例項物件呼叫了方法,於是要求方法必須繫結(通過 self 引數)才能呼叫。而未例項化的類物件直接呼叫方法,因為缺少 self 引數,所以就會報錯

6,綜合舉例:

    遊戲程式設計:按以下要求定義一個烏龜類和魚類並嘗試編寫遊戲。
O    假設遊戲場景為範圍(x, y)為0<=x<=10,0<=y<=10

  • 遊戲生成1只烏龜和10條魚
  • 它們的移動方向均隨機
  • 烏龜的最大移動能力是2(Ta可以隨機選擇1還是2移動),魚兒的最大移動能力是1
  • 當移動到場景邊緣,自動向反方向移動
  • 烏龜初始化體力為100(上限)
  • 烏龜每移動一次,體力消耗1
  • 當烏龜和魚座標重疊,烏龜吃掉魚,烏龜體力增加20
  • 魚暫不計算體力
  • 當烏龜體力值為0(掛掉)或者魚兒的數量為0遊戲結束

實現程式碼如下:

    1. import random as r

    2. legal_x = [0, 10]
    3. legal_y = [0, 10]

    4. class Turtle:
    5.     def __init__(self):
    6.         # 初始體力
    7.         self.power = 100
    8.         # 初始位置隨機
    9.         self.x = r.randint(legal_x[0], legal_x[1])
    10.         self.y = r.randint(legal_y[0], legal_y[1])

    11.     def move(self):
    12.         # 隨機計算方向並移動到新的位置(x, y)
    13.         new_x = self.x + r.choice([1, 2, -1, -2])
    14.         new_y = self.y + r.choice([1, 2, -1, -2])
    15.         # 檢查移動後是否超出場景x軸邊界
    16.         if new_x < legal_x[0]:
    17.             self.x = legal_x[0] - (new_x - legal_x[0])
    18.         elif new_x > legal_x[1]:
    19.             self.x = legal_x[1] - (new_x - legal_x[1])
    20.         else:
    21.             self.x = new_x
    22.         # 檢查移動後是否超出場景y軸邊界
    23.         if new_y < legal_y[0]:
    24.             self.y = legal_y[0] - (new_y - legal_y[0])
    25.         elif new_y > legal_y[1]:
    26.             self.y = legal_y[1] - (new_y - legal_y[1])
    27.         else:
    28.             self.y = new_y        
    29.         # 體力消耗
    30.         self.power -= 1
    31.         # 返回移動後的新位置
    32.         return (self.x, self.y)

    33.     def eat(self):
    34.         self.power += 20
    35.         if self.power > 100:
    36.             self.power = 100

    37. class Fish:
    38.     def __init__(self):
    39.         self.x = r.randint(legal_x[0], legal_x[1])
    40.         self.y = r.randint(legal_y[0], legal_y[1])
    41.         
    42.     def move(self):
    43.         # 隨機計算方向並移動到新的位置(x, y)
    44.         new_x = self.x + r.choice([1, -1])
    45.         new_y = self.y + r.choice([1, -1])
    46.         # 檢查移動後是否超出場景x軸邊界
    47.         if new_x < legal_x[0]:
    48.             self.x = legal_x[0] - (new_x - legal_x[0])
    49.         elif new_x > legal_x[1]:
    50.             self.x = legal_x[1] - (new_x - legal_x[1])
    51.         else:
    52.             self.x = new_x
    53.         # 檢查移動後是否超出場景y軸邊界
    54.         if new_y < legal_y[0]:
    55.             self.y = legal_y[0] - (new_y - legal_y[0])
    56.         elif new_y > legal_y[1]:
    57.             self.y = legal_y[1] - (new_y - legal_y[1])
    58.         else:
    59.             self.y = new_y
    60.         # 返回移動後的新位置
    61.         return (self.x, self.y)

    62. turtle = Turtle()
    63. fish = []
    64. for i in range(10):
    65.     new_fish = Fish()
    66.     fish.append(new_fish)

    67. while True:
    68.     if not len(fish):
    69.         print("魚兒都吃完了,遊戲結束!")
    70.         break
    71.     if not turtle.power:
    72.         print("烏龜體力耗盡,掛掉了!")
    73.         break

    74.     pos = turtle.move()
    75.     # 在迭代器中刪除列表元素是非常危險的,經常會出現意想不到的問題,因為迭代器是直接引用列表的資料進行引用
    76.     # 這裡我們把列表拷貝給迭代器,然後對原列表進行刪除操作就不會有問題了^_^
    77.     for each_fish in fish[:]:
    78.         if each_fish.move() == pos:
    79.             # 魚兒被吃掉了
    80.             turtle.eat()
    81.             fish.remove(each_fish)
    82.             print("有一條魚兒被吃掉了...")