调用方法作为参数

时间:2019-10-08 17:01:54

标签: python

关于Python的newb总数,请首先在这里发布(尽管到目前为止,我已经大量使用了帮助页面)-如果我忽略了任何明显的内容,请原谅我。

我正在尝试使用类中的函数作为类外部函数中的参数,但它不起作用。这是我的代码...

# These are the attributes I use to build my fighter class and their various attack moves.

combat_system.py

Class Attack:
    def __init__(self, name, ST, QU, FL):
        self.name = name       
        self.SP = SP
        self.ST = ST
        self.QU = QU
        self.FL = FL

    def punch(self):
        return int(self.ST + self.QU)

    def kick(self):
        return int(self.ST + self.FL)

# Class instances are built from a dict
Rex = {'name': Rex, 'ST': 5, 'QU': 8, 'FL': 7}
Mac = {'name': Mac, 'ST': 9, 'QU': 3, 'FL': 3}

#And class instances are established in the game.py file

game.py
attacker1 = Attack(Rex['name'], Rex['ST']...
attacker2 = Attack(Mac['name'], Mac['ST']...

当我这样做时,我得到了期望的结果...请注意,此函数位于“攻击类”之外。 (attacker1,攻击者2,防御者1和防御者2都是攻击类实例)

combat_system.py

def battle():
    attack1_result = attacker1.punch() - defender1.punch() 
    attack2_result = attacker2.kick() - defender2.kick()
    return attack1_result, attack2_result

但是我要做的是让玩家选择每个攻击者执行的动作并将该攻击等级功能传递给战斗功能

# gamer makes a choice for each attacker

game.py

    xy = battle(punch, kick)

然后我在战斗功能中编写如下代码...

combat_system.py

    def battle(attack1_move, attack2_move):
        attack1_result = attacker1.attack1_move() - defender1.attack1_move() 
        attack2_result = attacker2.attack2_move() - defender2.attack2_move()
        return attack1_result, attack2_result

我收到以下错误:

  

NameError:名称“ punch”未定义

当我尝试这个时-

game.py

    xy = battle(Attack.punch, Attack.kick)

combat_system.py

    def battle(attack1_move, attack2_move):
        attack1_result = attacker1.attack1_move() - defender1.attack1_move() 
        attack2_result = attacker2.attack2_move() - defender2.attack2_move()
        return attack1_result, attack2_result

我收到以下错误:

  

AttributeError:“攻击”没有属性“ attack1_move”

最后,当我尝试这个时-

game.py

    xy = battle(Attack.punch(), Attack.kick())

combat_system.py

    def battle(attack1_move, attack2_move):
        attack1_result = attacker1.attack1_move() - defender1.attack1_move() 
        attack2_result = attacker2.attack2_move() - defender2.attack2_move()
        return attack1_result, attack2_result

我收到此错误:

  

TypeError:必须以Attack实例作为第一个参数来调用未绑定方法punch()(而是什么也不做)

任何对我做错事情的帮助将不胜感激。预先感谢您,如果我为了提供帮助而省略了任何必要的信息,请联系LMK。

1 个答案:

答案 0 :(得分:3)

这是您最有希望的尝试:

xy = battle(Attack.punch, Attack.kick)

要使其正常工作,您需要:

def battle(attack1_move, attack2_move):
    attack1_result = attack1_move(attacker1) - attack1_move(defender1) 
    attack2_result = attack2_move(attacker2) - attack2_move(defender2)
    return attack1_result, attack2_result

这里的关键要点是,my_obj.method(...)MyClass.method(my_obj, ...)相同


也可以使用

xy = battle('punch', 'kick')

为:

def battle(attack1_move, attack2_move):
    attack1_result = getattr(attacker1, attack1_move)() - getattr(defender1, attack1_move)() 
    attack2_result = getattr(attacker2, attack2_move)() - getattr(defender2, attack2_move)()
    return attack1_result, attack2_result