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遊戲結束
實現程式碼如下:
- import random as r
- legal_x = [0, 10]
- legal_y = [0, 10]
- class Turtle:
- def __init__(self):
- # 初始體力
- self.power = 100
- # 初始位置隨機
- self.x = r.randint(legal_x[0], legal_x[1])
- self.y = r.randint(legal_y[0], legal_y[1])
- def move(self):
- # 隨機計算方向並移動到新的位置(x, y)
- new_x = self.x + r.choice([1, 2, -1, -2])
- new_y = self.y + r.choice([1, 2, -1, -2])
- # 檢查移動後是否超出場景x軸邊界
- if new_x < legal_x[0]:
- self.x = legal_x[0] - (new_x - legal_x[0])
- elif new_x > legal_x[1]:
- self.x = legal_x[1] - (new_x - legal_x[1])
- else:
- self.x = new_x
- # 檢查移動後是否超出場景y軸邊界
- if new_y < legal_y[0]:
- self.y = legal_y[0] - (new_y - legal_y[0])
- elif new_y > legal_y[1]:
- self.y = legal_y[1] - (new_y - legal_y[1])
- else:
- self.y = new_y
- # 體力消耗
- self.power -= 1
- # 返回移動後的新位置
- return (self.x, self.y)
- def eat(self):
- self.power += 20
- if self.power > 100:
- self.power = 100
- class Fish:
- def __init__(self):
- self.x = r.randint(legal_x[0], legal_x[1])
- self.y = r.randint(legal_y[0], legal_y[1])
-
- def move(self):
- # 隨機計算方向並移動到新的位置(x, y)
- new_x = self.x + r.choice([1, -1])
- new_y = self.y + r.choice([1, -1])
- # 檢查移動後是否超出場景x軸邊界
- if new_x < legal_x[0]:
- self.x = legal_x[0] - (new_x - legal_x[0])
- elif new_x > legal_x[1]:
- self.x = legal_x[1] - (new_x - legal_x[1])
- else:
- self.x = new_x
- # 檢查移動後是否超出場景y軸邊界
- if new_y < legal_y[0]:
- self.y = legal_y[0] - (new_y - legal_y[0])
- elif new_y > legal_y[1]:
- self.y = legal_y[1] - (new_y - legal_y[1])
- else:
- self.y = new_y
- # 返回移動後的新位置
- return (self.x, self.y)
- turtle = Turtle()
- fish = []
- for i in range(10):
- new_fish = Fish()
- fish.append(new_fish)
- while True:
- if not len(fish):
- print("魚兒都吃完了,遊戲結束!")
- break
- if not turtle.power:
- print("烏龜體力耗盡,掛掉了!")
- break
- pos = turtle.move()
- # 在迭代器中刪除列表元素是非常危險的,經常會出現意想不到的問題,因為迭代器是直接引用列表的資料進行引用
- # 這裡我們把列表拷貝給迭代器,然後對原列表進行刪除操作就不會有問題了^_^
- for each_fish in fish[:]:
- if each_fish.move() == pos:
- # 魚兒被吃掉了
- turtle.eat()
- fish.remove(each_fish)
- print("有一條魚兒被吃掉了...")