方法继承问题

时间:2016-08-07 09:02:05

标签: python class inheritance methods

当我尝试创建一个' BJ_player'对象:

player = BJ_player(name, number_chips)

我收到:

  

TypeError: init ()只需要2个位置参数(给定3个)。

我使用相同的方法继承了BJ_Hand'正如我从“手”那样继承。

有人可以解释一下吗?

这第一堂课位于“cardmodule':

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__()

4 个答案:

答案 0 :(得分:2)

您定义的__init__方法仅包含一个参数(加self):

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

name没有参数,但您尝试将其传递给:{/ p>

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

Python不会为您查找所有基本__init__方法;它只会“看到”BJ_player。如果您想为name传递BJ_hand.__init__值,则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参数现在如何在链中传递。

答案 1 :(得分: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)

答案 2 :(得分: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)

试过这个并且它有效

答案 3 :(得分:1)

虽然其他答案(大多数)已经(大部分)正确诊断了您所描述的具体问题(不接受name中的BJ_player.__init__并在super电话中传递),我认为一个更大的设计问题,在使用您的课程时可能会导致其他问题。

具体地说,玩家和他们手中的牌之间的关系不能很好地表现为继承。继承通常被描述为“IS-A”关系。例如,定义一个继承自Dog父类的Animal类是有意义的,因为每个Dog 都是一个Animal。

玩家和手牌不是这种情况。二十一点玩家不是某种牌的牌。每个玩家都有一张牌。对象之间的“HAS-A”关系最好用组合实现。也就是说,BJ_player实例应该有一个Hand实例作为实例变量。这可能会以其他方式释放您的设计。例如,当它在娱乐场中不忙时,一个玩家可以在同一桌上同时玩几手牌。使用继承表示这是不可能的,但是将Hand实例上的实例变量中保存的单个Player实例更改为一个或多个{{ 1}}实例。

我还建议您在Hand上存储的name属性更适合作为播放器的属性。拥有一个BJ_hand类可能仍然有意义,它可以处理诸如计算所发卡的价值(以及你是否已经被破坏)之类的事情,但你可能需要考虑一下属性在手上存储是有意义的,而在其他地方更合适。