【问题标题】:automatically instantiating objects自动实例化对象
【发布时间】:2020-07-03 20:07:44
【问题描述】:
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中的obj:object(obj) = Player(obj)?

标签: python class oop instantiation


【解决方案1】:

首先您应该知道,您声明的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 对象存储在您声明的列表中,只是您希望获得的东西。

【讨论】:

    【解决方案2】:

    您遇到了未定义球员的问题。所以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]
    

    【讨论】:

      【解决方案3】:

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

      您可以尝试使用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 的方式是写出变量,“显式优于隐式。”

      【讨论】:

        猜你喜欢
        • 2017-05-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多