【问题标题】:Naming a class from a variable?从变量中命名一个类?
【发布时间】:2019-04-10 18:44:41
【问题描述】:

我正在做一个项目,我有一个由不同玩家类组成的团队类。

我想要一个函数来创建新玩家并将他们添加到团队中,但我不想将新玩家类命名为 newPlayer() 之类的名称,而是希望类名是玩家的名字,所以我不如果我创建多个新玩家并拥有相同 newPlayer() 的团队,则会遇到问题

例如,我想要一个这样的函数:

def createPlayer(player_name, player_skill):
    class player_name:
        skill = playerskill
    player_name = player_name()

所以如果我跑:

createPlayer('Mike', 10)

我会得到一个名为 Mike 的类,我可以通过 team.Mike.speed 获得 Mike 的速度

有没有可能得到这样的东西?

【问题讨论】:

标签: python class


【解决方案1】:

你不应该在函数中定义类;您将函数定义为类的方法之一(即__init__):

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

player = Player("Mike", 10)

您定义类一次,然后创建多个类的实例

【讨论】:

    【解决方案2】:

    您可以定义一个以名称为键的字典。

    team = {}
    team["Mike"] = create_player("Mike",10)
    

    现在如果你运行

    team["Mike"]
    

    你会得到迈克

    【讨论】:

      【解决方案3】:

      NamedTuples 可能是一个更简洁的例子

      >>> from collections import namedtuple
      >>> Player = namedtuple('MyPlayer', 'name skill')
      >>> Player('Joe', 20)
      MyPlayer(name='Joe', skill=20)
      >>> jim = Player('Jim', 99)
      >>> jim.skill
      99
      

      如果您只是死心塌地使用动态类,那么在运行时生成它们非常简单。

      >>> Joe = type('Joe', (object,), {'skill': 20})
      >>> Joe.skill
      20
      

      【讨论】:

        【解决方案4】:

        即使我同意@chepner,您确实可以在运行时创建类:

        def createPlayer(player_name, player_skill):
            return type(player_name, (), {'skill': player_skill})
        
        Mike = createPlayer('Mike', 10)
        player = Mike()
        print(player.__class__, player.skill)  # <class '__main__.Mike'> 10
        

        注意: Mike = createPlayer('Mike', 10) 等价于:

        class Mike:
            skill = 10
        

        skill 是类属性,而不是实例属性,如下面的 sn-p 所示:

        def createPlayer(player_name, player_skill):
            return type(player_name, (), {'skill': player_skill})
        
        Mike = createPlayer('Mike', 10)
        print(Mike.skill)  # 10
        
        player1 = Mike()
        player2 = Mike()
        
        print(player1.skill, player2.skill, Mike.skill)  # 10 10 10
        player1.skill = 20
        print(player1.skill, player2.skill, Mike.skill)  # 20 10 10
        

        在 Google 上快速搜索“元类”可能会为您提供一些更广泛的资源(例如 thisthis)。

        【讨论】:

          猜你喜欢
          • 2012-08-08
          • 2014-01-12
          • 1970-01-01
          • 2014-04-29
          • 1970-01-01
          • 2014-06-26
          • 2021-04-30
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多