自动实例化对象

automatically instantiating objects

players_list = [Ani, Paty, Felix, Alex]

class Player:

def __init__(self, name):
    self.name = name
    self.score = 0
    self.vote = 0
    self.player_hand = []
    self.choice = ''
    self.player_hand = []
            
def player_turn(self):
    print(self.name, "'s turn")


def p_vote(self):
    print(self.name, " voted")

我试图遍历列表,但它总是给我一个错误:NameError: name 'Ani' is not defined

for player in players_list:
    player = Player(str(player))

但是手动完成所有过程:

Ani = Player("Ani"),等等

有什么方法可以使这个过程自动化?

首先你应该知道,你声明的 players_list 不包含字符串,它们被认为是你没有在任何地方定义的变量,因此 NameError .

现在,如果您想更正此问题,并且您确实打算将 Player 的对象存储在 players_list 中,那么您可以执行以下操作:

players_list = ["Ani", "Paty", "Felix", "Alex"]

class Player:

    def __init__(self, name):
        self.name = name
        self.score = 0
        self.vote = 0
        self.player_hand = []
        self.choice = ''
        self.player_hand = []
            
    def player_turn(self):
        print(self.name, "'s turn")
    
    
    def p_vote(self):
        print(self.name, " voted")
        
for i in range(len(players_list)):
    players_list[i]=Player(players_list[i])

这会将 Player 对象存储在您声明的列表中,这正是您希望获得的内容。

你遇到了未定义玩家的问题。所以 players_list = [Ani, Paty, Felix, Alex] 将抛出错误,因为对象 AniPatyFelizxAlex 不存在。

 class Player:
    def __init__(self, name):
        self.name = name
        self.score = 0
        self.vote = 0
        self.player_hand = []
        self.choice = ''
        self.player_hand = []
            
    def player_turn(self):
        print(self.name, "'s turn")


    def p_vote(self):
        print(self.name, " voted")

现在,我们需要遍历列表。

players_list = ['Ani', 'Paty', 'Felix', 'Alex']
players = [Player(player) for player in players_list]

听起来您正在尝试动态创建变量 - 编写代码的代码。

您可以尝试使用 exec 内置函数。

players = ['Ani', 'Paty', 'Felix', 'Alex']

class Player:
    def __init__(self, name):
        self.name = name

    def p_vote(self):
        print(self.name + " voted.")

for player in players:
    exec( "%s = Player( '%s' )" %(player, player) )

Ani.p_vote()

尽管如此,一般的互联网建议有两点:

  • 请谨慎使用 exec
  • Pythonic 方式是写出变量,“显式优于隐式”。