learn with python 第十五章 繼承

2021-06-22 14:22:41 字數 2903 閱讀 1759

第十六章:繼承

16.1繼承

物件導向語言所擁有的特性是繼承,繼承指定義乙個新的類擁有原來類的方法。

繼承最大的好處就是可以在不改變現存**的情況下新增新的方法,稱之為繼承是因為新定義的類擁有父類的所有方法。新建立的類知之為子類。

繼承是乙個功能強大的特性,某些情況下如果沒有繼承,一些層序幾乎無法實現。同時繼承有助於**的重用,你可以在不改變**的情況下改變父類的行為。

某些情況下繼承也能讓**更加難以理解,當某個方法被呼叫的時候需要尋找其真正的方法定義,相關的**可能分散在多個模組中,我們需要根據需求來決定是否使用繼承。

本章中我們會使用繼承編寫乙個紙牌遊戲。

16.2一手牌

大部分的紙牌遊戲,我們需要持有一手牌,一手牌同一副牌一樣都包含乙個紙牌的集合,需要起牌和出牌。

一手牌和一副牌也有區別,依賴於紙牌遊戲的玩法,一手牌可能包含了一副牌中所沒有的操作。例如:在德州撲克中我們需要分類,或者同其他的玩家的牌進行比較,在橋牌中我們需要計算積分。

一手牌是一副牌的子類,它包含一副牌的所有方法,並且可以新增新的方法。

在類的定義中,父類的名字出現在類定義的括號中:

class hand(deck):

表示式該類繼承自deck類。

hand建構函式初始化類的屬性值name和cards字串name標識哪一手牌,可能為玩牌人的名字,name是可選引數,擁有乙個空的字串作為預設值,cards是擁有的牌,初始化為空的集合:

class hand(deck):

def ___init__(self, name=""):

self.cards =

self.name = name

任何紙牌遊戲都有從牌桌上獲取牌以及移除牌的操作,移除牌我們可以從父類deck中繼承,這裡實現獲取紙牌。

def addcard(self, card):

16.3dealing cards

現在我們也有了hand類,我們需要從一副牌中獲取牌到手上,那麼應該是hand類中還是deck類中呢?一副牌可能由多個人玩,那麼我們將該方法放在deck中。

deal方法應該非常通用,不同的玩法有不同的規則,我們會從一副牌中減少一張牌,獲取牌的人增加一張牌。deal方法有兩個引數,乙個列表表示取牌人手上的牌,以及獲取牌的數量。

def deal(self, hands, ncards=999):

nhands = len(hands)

for i in range(ncards):

if self.isempty():

break

card = self.popcard()

hand = hands[i % nhands]

hand.addcard(card) 

第二個引數ncards可選,預設為乙個很大的值,將一副撲克牌獲取完。取模操作符計算當前牌應該屬於哪乙個人。

16.4列印hand

列印某個人有的牌我們可以包裝printdeck以及從deck中繼承的__str__方法,重寫父類deck中的__str__方法

def __str__(self):

s = "hand " + self.name

if self.isempty():

s = s + " is empty\n"

else:

s = s + " contains\n"

return s+deck.__str__(self)

16.5cardgame類

cardgame類關注所有遊戲的共同點,例如:建立一副牌並進行洗牌:

class cardgame:

def __init__(self):

self.deck = deck()

self.deck.shuffle()

這裡我們第一次看到初始化方法__init__中除了初始化屬性之外,執行一些邏輯,而對於特定的紙牌遊戲我們可以繼承cardgame實現自己的特殊方法,例如我們實現紙牌遊戲老**。

這種玩法的規則是依照紙牌的花色和值出光手中的牌,例如:梅花4和黑桃4配對,應為他們都是黑色的,方塊4和紅心4配對都是紅色的。遊戲開始前,梅花q從紙牌中移除,因此黑桃q沒有能夠配對的牌,玩家依次獲取剩下51張牌中的牌。

當手中沒有可配對的牌時游開始,輪流的,每位玩家從旁邊玩家的手中抽取一張牌,如果抽取的牌可以和自己手中的牌配對,那麼移除,否則這張牌就歸自己所有,最後所有的牌都出完了,只剩下不能配對的黑桃q在失敗者的手中。

我們用電腦模擬紙牌遊戲,電腦扮演所有的玩家,電腦所模擬的遊戲和真實遊戲有細微區別,真實的玩家會努力讓旁邊的玩家抽取到自己手中的黑桃q,而電腦只是簡單從下家的牌中抽取一張。

16.6oldmaidhand類

玩oldmain的玩家需要普通玩家的一些額外的特性,我們定義乙個新的類oldmainhand繼承hand,提供方法removematches移除可以配對的牌。

class oldmaidhand(hand):

def removematches(self):

count = 0

originalcards = self.cards[:]

for card in orginalcards:

match = card(3-card.suit,card.rank)

if match in self.cards:

self.cards.remove(card)

self.cards.remove(match)

print("hand %s: %s matches %s" % (self.name, card, match))

count = count + 1

return count

對玩家手中的牌做了乙個拷貝,因此在移除可以配對的牌的時候還可以對玩家手中的牌進行遍歷,對於在遍歷過程中對集合進行修改,python會報錯。對於手中的每張牌,我們計算出與其相匹配的牌然後再手中進行尋找。如果存在則移除這兩張相匹配的紙牌。

第十五章預習

public class yuxi15 else 字串的比較 字串1.equals 字串2 比較兩個字串的值是否相同,返回boolean型別的值.如果相同,則返回真值,否則返回假值.字串1.equalsignorecase 字串2 忽略大小寫比較字串1和字串2.如果都相同則返回真值 否則返回假值 改...

第十五章 磁碟管理

uuid 掛載點swap 產品型別swap 掛載選項預設值default 預設不檢測,檢測順序 0 0 檢視分割槽 swapon s s表示show 手動掛載 swapon dev sda3 缺點 重啟後就消失,想永久生效,寫配置檔案 解除安裝分割槽 swapoff dev sda3 vim etc...

第十五章 整合JPUSH

如果不想自己搭建push server,則可以借助於第三方的api來實現push的功能,本文主要介紹ionic如何整合jpush。具體步驟如下 third way git clone 找到路徑 ionic jpush plugins cn.jpush.phonegap.jpushplugin src...