当我尝试创建一个' 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__()
答案 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
类可能仍然有意义,它可以处理诸如计算所发卡的价值(以及你是否已经被破坏)之类的事情,但你可能需要考虑一下属性在手上存储是有意义的,而在其他地方更合适。