python - builtins.TypeError: __init__() 接受 1 个位置参数,但给出了 2 个
问题描述
这是我的第一个问题,我收到 TypeError。我想我改变了一切,但结果并没有改变。由于我是新手,我认为错误可能非常明显。我将特别感谢任何向我指出其他错误的人似乎BJ_game 类的init函数有 2 个参数,但跟踪显示为 1,请解释原因
Traceback (most recent call last):
File "G:/СОБСТВЕННОСТЬ А. С/Black - Djack/Black - Djack.py", line 255, in <module>
main()
File "G:/СОБСТВЕННОСТЬ А. С/Black - Djack/Black - Djack.py", line 246, in <module>
game = BJ_Game(names)
File "G:/СОБСТВЕННОСТЬ А. С/Black - Djack/Black - Djack.py", line 174, in <module>
player = BJ_Player(name)
builtins.TypeError: __init__() takes 1 positional argument but 2 were given
#!/usr/bin/env python
# -*- coding: utf8 -*-
class CARD(object):
#объявляем масти и ранги
Ranks = ['2','3','4','5','6','7','8','9','10','J','Q','K','A',]
Suits = ['tre','pik','che','bub']
def __init__(self, rank, suit, face_up = True):
self.rank = rank
self.suit = suit
self.is_face_up = face_up
def __str__(self):
#"собирает" карту из масти и ранга
if self.is_face_up:
rep = self.rank + self.suit
else:
rep = 'XX'
return rep
def flip(self):
self.is_face_up = not self.is_face_up
class Hand(object): #стандартная рука игрока
def __init__(self):
self.cards = []
def __str__(self):
#спец. метод, собирает карты в строку
if self.cards:
rep = ""
for card in self.cards:
rep += str(card) + "\t"
else:
rep = '<none>'
return rep
def clear_hand(self):
self.cards = []
def add_card(self, card):
self.cards.append(card)
def give(self, other_hand, card):
self.cards.remove(card)
other_hand.add_card(card)
class Deck (Hand): #класс колоды
def populate(self):
#перебирает комбинации мастей и рангов, создавая колоду
for suit in CARD.Suits:
for rank in CARD.Ranks:
self.add_card(CARD(rank, suit))
def shuffle(self):
import random
random.shuffle(self.cards)
def deal(self, hands, per_hand = 1):
#раздача карт
for rounds in range(per_hand):
for hand in hands:
if self.cards:
#берет верхнюю карту и добавляет ее на руку
top_card = self.cards[0]
self.give(hand, top_card)
else:
print('больше нет карт!')
class Player():
def _init_(self, name, score = 0):
self.name = name
self.score = score
def __str__ (self):
rep =self.name + ":\t" + str(self.score)
return rep
def ask_yes_no(question):
response = None
while response not in ("у", "n"):
response = input(question).lower()
return response
def ask_number(question, high, low):
response = None
while response not in range(low, high):
response = int(input(question))
return response
class BJ_Card(CARD):
#карта для игры в Блек - джек
Ace_value = 1
@property
def value(self):
if self.is_face_up:
v = BJ_Card.Ranks.index(self, rank) + 1
if v > 10:
v = 10
else:
v = None
return v
class BJ_Deck(Deck):
def populate(self):
for suit in BJ_Card.Suits:
for rank in BJ_Card.Ranks:
self.cards.append(BJ_Card(rank. suit))
class BJ_Hand(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
def total(self):
#если у одной из карт value равно None. то и все свойство равно None
for card in self.cards:
if not card.value:
return None
#суммируем очки. считая каждый туз за 1 очко
t = о
for card in self.cards:
t += card.value
#определяем. есть ли туз на руках у игрока
contains_ace = False
for card in self.cards:
if card.value == BJ_Card.ACE_VALUE:
contains_асе = True
# если на руках есть туз и сумма очков не превышает 11. будем считать туз за 11
if contains_асе and t <= 11:
# прибавить нужно лишь 10. потому что единица уже вошла в общую сумму
t += 10
return t
def is_busted(self):
return self.total > 21
class BJ_Player(BJ_Hand):
def is_hitting(self):
response = games_module.ask_yes_no("\n" + self.name +" будете брать еще карты?(Y/N): ")
return response == "у"
def bust(self):
print(self.name, "перебрал.")
self.lose()
def lose(self):
print (self. name, "проиграл.")
def win(self):
print(self.name, "выиграл.")
def push(self):
print(self.name, "сыграл вничью.")
class BJ_Dealer(BJ_Hand):
def is_hitting(self):
return self.total < 17
def bust(self):
print (self. name, 'перебрал. ')
def flip_first_card(self):
first_card = self.cards[O]
first_card.flip()
class BJ_Game():
def __init__(self,names = 'Player1'):
self.players = []
for name in names:
player = BJ_Player(name)
self.players.append(player)
self.dealer = BJ_Dealer('dealer')
self.deck = BJ_Deck()
self.deck = populate()
self.deck = Shuffle()
@property
def still_playing(self):
sp =[]
for player in self.players:
if not player.is_busted():
sp.attend(player)
return sp
def __addittional_cards(self, player):
while not player.is_busted() and player.is_hitting():
self.deck.deal([player])
print(player)
if player.is_busted():
player.bust()
def game_process(self):
#раздача всем по 2 карты
self.deck.deal(self.players+[self.dealer], per_hand = 2)
#первая карта дилера скрывается
self.dealer.flip_first_card()
for player in self.players:
print(player)
print(self.dealer)
#раздача доп. карт игрокам
for player in self.players:
self.__additional_cards(player)
#раскрытие первой карты дилера
self.dealer.flip_first_card()
#если все перебрали показываем руку дилера
if not self.still_playing:
print(self.dealer)
else:
#даем доп карты дилеру
print(self.dealer)
self.__additional_cards(self.dealer)
#если дилер перебрал, побеждают оставшиеся игроки
if self.dealer.is_busted():
for players in self.still_playing:
player.win()
#сравниваем очки у игроков и дилера
else:
for player in self.still_playing:
if player.total > self.dealer.total:
player.win()
elif player.total < self.dealer.total:
player.lose()
else:
рlayer.push()
#удаляем карты из игры
for player in self.players:
player.clear()
self.dealer.clear()
#основная часть
def main():
print("\t\tДoбpo пожаловать за игровой стол Блек-джека!\n")
names = []
number = Player.ask_number("Cкoлькo всего игроков? (1 - 7): ", low = 1, high= 8)
for i in range(number):
name = input ('введите имя игрока: ')
names.append(name)
print()
game = BJ_Game(names)
again = None
while again != "n":
game.game_process()
again = Player.ask_yes_no("\nXoтитe сыграть еще раз? ")
main()
iпрut("\n\пНажмите Enter. чтобы выйти.")
main()
解决方案
错误来自 player = BJ_Player(name) line 174
在 BJ_Player 类中你没有定义__init__
函数,所以默认情况下它需要
def __init__(self)
它只有 self 作为一个变量,但是当您创建对象时,您正在传递另一个变量name
,这就是为什么它会给您错误,即您在需要 1 时传递了 2 个变量。
在 BJ_Player 类和其他类中定义__init__
函数,在这些类中传递对象创建数据。__init__
作为类的构造函数。例如 BJ_Player 应该是这样的:
class BJ_Player(BJ_Hand):
def __init__(self,name):
self.name = name
编辑: juanpa 建议您在 Player 函数中定义了 init ,但它有一个错字,这就是为什么使用 1 个位置参数调用默认init的原因。无需在这里明确定义
推荐阅读
- teamcity - Teamcity 构建日志每行打印一个或多个符号
- kotlin - spring data rest kotlin 关联 POST
- java - 查找 2 纬度和经度点之间的距离。我使用了公式,但答案不是你所期望的
- c++ - C++ 避免对未使用的代码部分发出警告
- sql-server - SQL Server 在每日加载后未释放内存
- c# - 对于大型架构,Swashbuckle 非常慢
- c# - 如何搜索名称中包含字符串的特定文本文件并将数据加载到richtextbox
- python - 使用 Python 将数组列表转换为可读表
- c# - GET 动词没有调用正确的动作
- embedded-jetty - Jetty 嵌入式 WebApp 部署中的类加载器问题