我正在研究一个项目,并且我有一个由不同的玩家类组成的团队类。
我想要一个函数来创建新的球员并将其添加到团队中,但是我不想将新的球员类命名为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的速度。
有可能得到这样的东西吗?
答案 0 :(得分:1)
您不应在函数中定义类。您可以将函数定义为类的方法之一(即__init__
):
class Player:
def __init__(self, name, skill):
self.name = name
self.skill = skill
player = Player("Mike", 10)
您一次定义类 ,并创建该类的多个实例。
答案 1 :(得分:1)
您可以定义一个名称为键的字典。
team = {}
team["Mike"] = create_player("Mike",10)
现在,如果您运行
team["Mike"]
你会得到麦克
答案 2 :(得分:1)
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
答案 3 :(得分:1)
即使我同意@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
是类属性,而不是实例属性,如以下代码片段所示:
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