繁体   English   中英

从变量命名类?

[英]Naming a class from a variable?

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

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

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

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

因此,如果我运行:

createPlayer('Mike', 10)

我将获得一个名为Mike的课程,并且可以与Mike一起获取team.Mike.speed的速度。

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

您不应该函数中定义类。 您可以将函数定义为类的方法之一(即__init__ ):

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

player = Player("Mike", 10)

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

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

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

现在,如果您运行

team["Mike"]

你会得到麦克的

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

即使我同意@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

Google快速搜索“元类”可能会为您提供更多信息(例如thisthis )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM