Python:调用定义时使用变量

Python:调用定义时使用变量,python,Python,我目前正在为CompSci课程制作一个游戏,我想缩短我们的随机怪物战斗。有没有办法让我在调用def时可以根据随机变量更改名称?这就是我要说的片段 我有 def Monster1 def Monster2 def Monster3 . . . def Monster20 我希望第一个代码片段中的*是变量MonsterType,有没有办法让它这样做?也就是说,当它运行时,如果MonsterType=15,则调用的将是Monster13()。是的,有一种方法,创建一个字典并将每个函数映射到一个整数

我目前正在为CompSci课程制作一个游戏,我想缩短我们的随机怪物战斗。有没有办法让我在调用def时可以根据随机变量更改名称?这就是我要说的片段

我有

def Monster1
def Monster2
def Monster3
.
.
.
def Monster20

我希望第一个代码片段中的*是变量MonsterType,有没有办法让它这样做?也就是说,当它运行时,如果MonsterType=15,则调用的将是Monster13()。

是的,有一种方法,创建一个
字典
并将每个函数映射到一个整数:

import random

def monster1():
    print "Hello monster1"

def monster2():
    print "Hello monster2"

def monster3():
    print "Hello monster3"

def monster4():
    print "Hello monster4"

d = {1:monster1, 2:monster2, 3:monster3, 4:monster4}

#When you need to call:
monsterType = random.randint(1, 4)
d[monsterType]()

是的,有一种方法,创建一个
字典
并将每个函数映射到一个整数:

import random

def monster1():
    print "Hello monster1"

def monster2():
    print "Hello monster2"

def monster3():
    print "Hello monster3"

def monster4():
    print "Hello monster4"

d = {1:monster1, 2:monster2, 3:monster3, 4:monster4}

#When you need to call:
monsterType = random.randint(1, 4)
d[monsterType]()

在阅读了您试图实现的目标后,我相信使用OOP将更适合您的情况:

# A class for a bunch of monsters
class Mob(object):
    def __init__(self, num_monsters):
        self._num_monsters = num_monsters
        self._monsters = []
        for i in range(self._num_monsters):
            # randomly create a type of monster based on the number of monsters
            self._monsters.append(Monster(random.randint(0, self._num_monsters)))

# Each monster has a type that is attacks with
class Monster(object):
    def __init__(self, monster_type):
        self._type = monster_type

    def attack(self):
        print(self._type)

test = Mob(20)

在阅读了您试图实现的目标后,我相信使用OOP将更适合您的情况:

# A class for a bunch of monsters
class Mob(object):
    def __init__(self, num_monsters):
        self._num_monsters = num_monsters
        self._monsters = []
        for i in range(self._num_monsters):
            # randomly create a type of monster based on the number of monsters
            self._monsters.append(Monster(random.randint(0, self._num_monsters)))

# Each monster has a type that is attacks with
class Monster(object):
    def __init__(self, monster_type):
        self._type = monster_type

    def attack(self):
        print(self._type)

test = Mob(20)

听起来你使用了一点OOP。我建议:

class Monster(object):
  def __init__(self, name):
    self.name = name
  def do_work(self):
    print self.name
然后创建一个可以生成n个怪物对象的管理器,并提供一个静态方法来管理要调用的对象:

class MonsterManager(object):
  monsters = []
  def call_monster(self, index):
    monsters[i].do_work()
有了它,您可以有更好的用途,如:

manager = MonsterManager();
manager.monsters.append(Monster('Monster1')
manager.monsters.append(Monster('Monster2')
# etc
# then call a single monster
manager.call_monster(i)

听起来你用了一点OOP。我建议:

class Monster(object):
  def __init__(self, name):
    self.name = name
  def do_work(self):
    print self.name
然后创建一个可以生成n个怪物对象的管理器,并提供一个静态方法来管理要调用的对象:

class MonsterManager(object):
  monsters = []
  def call_monster(self, index):
    monsters[i].do_work()
有了它,您可以有更好的用途,如:

manager = MonsterManager();
manager.monsters.append(Monster('Monster1')
manager.monsters.append(Monster('Monster2')
# etc
# then call a single monster
manager.call_monster(i)

我不明白。你是在谈论继承吗?你能发布你的实际代码并更清楚地解释你的问题吗?我澄清了一点。基本上,*将是一个由类型决定的数字。只是想知道是否有办法将数字设置为怪物类型,而不是为每个怪物创建一组if和elif语句。创建一个基本怪物类型,然后创建一组从中继承的怪物。然后制作一个包含所有怪物的阵列。然后使用你生成的随机整数访问数组中的怪物。我会注意到,你通常想要的不是这个,而是一种可以根据需要为你生成怪物的方法。我不明白。你是在谈论继承吗?你能发布你的实际代码并更清楚地解释你的问题吗?我澄清了一点。基本上,*将是一个由类型决定的数字。只是想知道是否有办法将数字设置为怪物类型,而不是为每个怪物创建一组if和elif语句。创建一个基本怪物类型,然后创建一组从中继承的怪物。然后制作一个包含所有怪物的阵列。然后使用您生成的随机整数访问数组中的怪物。我会注意到,您通常想要的不是这个,而是一种可以根据需要为您生成怪物的方法。我甚至不会向不熟悉这是一个坏主意的人建议
eval()
。那只会很危险。也许说永远不要使用
eval()
,如果有的话:)我甚至不会向不知道为什么一开始使用
eval()
的人建议。那只会很危险。也许说永远不要使用
eval()
如果有的话:)哈哈,我的想法正是如此。我喜欢你的容器类名“mob”哈哈,我的想法正是如此。我喜欢你的容器类名“mob”