2016-08-07 45 views
0

當我試圖創建一個「BJ_player」對象:方法繼承問題

player = BJ_player(name, number_chips) 

我收到:

TypeError: init() takes exactly 2 positional arguments (3 given).

我用同樣的方法從「BJ_Hand」繼承和我一樣從'手'繼承。

請問有人能解釋一下嗎?

這第一類是位於 'cardsmodule':

class Hand(object): 
    """A hand of playing cards""" 
    def __init__(self): 
     self.cards = [] 

    def __str__(self): 
     if self.cards: 
      rep = "" 
      for card in self.cards: 
       rep += str(card) + "\t" 
     else: 
      rep = "<empty>" 
     return rep 
class BJ_hand(cardsmodule.Hand): 
    """A BlackJack hand""" 

    def __init__(self, name): 
     super(BJ_hand, self).__init__() 
     self.name = name 

    def __str__(self): 
     rep = self.name + "\t" + super(BJ_hand,self).__str__() 
     if self.total: 
      rep += "(" + str(self.total) + ")" 
     return rep 

class BJ_player(BJ_hand): 
    """A BlackJack player""" 
    def __init__(self, number_chips): 
     super(BJ_player, self).__init__() 
     #self.name = name 
     self.number_chips = number_chips 

    def __str__(self): 
     rep = self.name + " has " + str(self.number_chips) + " chips.\n" 
     rep += super(BJ_player, self).__init__() 
+0

您的'BJ_player'類構造函數不期望'name'參數。你需要添加一個'name'參數並傳遞給'super(BJ_player,self).__ init __(name)'。 –

+0

儘管有標題和標籤,但這並不是一個多重繼承問題。多重繼承是指當一個子類擁有多個直接父類(例如,母親和父親)時,而不是從自己從另一個類繼承的類(例如父親和祖父)繼承時。 – Blckknght

+0

謝謝。編輯。 –

回答

2

您定義的__init__方法只需要一個參數(加上self):

class BJ_player(BJ_hand): 
    """A BlackJack player""" 
    def __init__(self, number_chips): 
     #    ^^^^^^^^^^^^ 

沒有爲name沒有參數,但你試圖通過在:

player = BJ_player(name, number_chips) 
#     ^^^^ ^^^^^^^^^^^^ 

Python並不指望所有的基本__init__方法適合你;它只會'看到'BJ_player。如果您想通過BJ_hand.__init__name值,則BJ_player.__init__()必須接受作爲參數。然後,您可以通過電話super().__init__()通過它:

class BJ_player(BJ_hand): 
    """A BlackJack player""" 
    def __init__(self, name, number_chips): 
     super(BJ_player, self).__init__(name) 

注意如何從法name參數鏈正在傳遞。

+0

太棒了。非常感謝! –

1

這樣得出py2.7和py3.5沒有錯誤:

class Hand(object): 
    """A hand of playing cards""" 
    def __init__(self): 
     self.cards = [] 

    def __str__(self): 
     if self.cards: 
      rep = "" 
      for card in self.cards: 
       rep += str(card) + "\t" 
     else: 
      rep = "<empty>" 
     return rep 

class BJ_hand(Hand): 
    """A BlackJack hand""" 

    def __init__(self, name): 
     super(BJ_hand, self).__init__() 
     self.name = name 


    def __str__(self): 
     rep = self.name + "\t" + super(BJ_hand,self).__str__() 
     if self.total: 
      rep += "(" + str(self.total) + ")" 
     return rep 

class BJ_player(BJ_hand): 
    """A BlackJack player""" 
    def __init__(self, number_chips): 
     super(BJ_player, self).__init__('aName') 
     self.number_chips = number_chips 

    def __str__(self): 
     rep = self.name + " has " + str(self.number_chips) + " chips.\n" 
     rep += super(BJ_player, self).__init__() 

b = BJ_player (3) 
+0

嗨。這給出了同樣的錯誤。 –

+0

該代碼有效。但是當我開始我的BlackJack遊戲時,我需要通過BJ_player的名稱和籌碼數量,即player = BJ_player(name,number_chips)。這引發了同樣的錯誤。有一些我錯過了。 –

1

BJ_player類有問題。修改了類此:

class BJ_player(BJ_hand): 
    """A BlackJack player""" 
    def __init__(self, name, number_chips): 
     super(BJ_player, self).__init__(name) 
     self.name = name 
     self.number_chips = number_chips 

    def __str__(self): 
     rep = self.name + " has " + str(self.number_chips) + " chips.\n" 
     rep += super(BJ_player, self).__init__(self.name) 

嘗試這樣做,它的工作原理

1

而其他的答案已經(大部分)正確診斷你描述的具體問題(而不是在BJ_player.__init__接受name並將其傳遞中super調用),我認爲有更大的設計問題可能會導致您在處理類時遇到其他問題。

具體來說,玩家和手牌之間的關係不能很好地通過繼承來表示。繼承通常被描述爲「IS-A」關係。例如,定義從Animal父類繼承的類Dog是有意義的,因爲每個Dog 是Animal。

這不是玩家和手中的情況。二十一點玩家不是某種手牌。每個玩家都有一張牌。對象之間的「HAS-A」關係最好通過合成來實現。也就是說,BJ_player實例應該有一個Hand實例作爲實例變量。這可能會以其他方式釋放您的設計。例如,在娛樂場不忙的時候,一個玩家可以在同一張桌子上同時玩多隻手。這是不可能用繼承來表示的,但將Player實例中保存在實例變量中的單個Hand實例更改爲一個或多個Hand實例的列表相當容易。

我還建議您在BJ_hand上存儲的name屬性更適合作爲玩家的屬性。如果有一個BJ_hand類,它可以處理諸如計算所處理卡片的價值(以及是否已經破產)的事情,但是您可能需要考慮一些屬性對於哪些屬性有意義儲存在手上,哪些在其他地方更合適。

+0

非常感謝。這個設計從我的初學者書中是直接的。然而,我明確地看到你的意思,現在你已經提醒我「有一個,是一個」的關係。我會按照你所描述的來製作一個版本。 –