Par exemple, comment puis-je utiliser au hasard l'une des quatre fonctions (au sein de la classe) répertoriées ci-dessous?

import random

class Calculate():
    def HI_1(x, y):
        return x + y
    def HI_2(x, y):
        return x - y
    def HI_3(x, y):
        return x * y
    def HI_4(x, y):
        return x/y


a = random.randint(1, 4)
b = 'HI_' + str(a)

p = Calculate.b(15, 7)
print(p)

Ma tentative de le faire est venue avec une erreur. Pourquoi ai-je eu cette erreur et comment faire?

1
Octavian Hubbabuba 13 avril 2018 à 04:54

3 réponses

Meilleure réponse

Vous pouvez utiliser getattr(), en plus vos méthodes doivent être déclaré comme staticmethod:

import random

class Calculate():
    @staticmethod
    def HI_1(x, y):
        return x + y

    @staticmethod
    def HI_2(x, y):
        return x - y

    @staticmethod
    def HI_3(x, y):
        return x * y

    @staticmethod
    def HI_4(x, y):
        return x/y


a = random.randint(1, 4)
b = 'HI_' + str(a)
p = getattr(Calculate, b)(15, 7)
print(b, p)
1
eyllanesc 13 avril 2018 à 02:01

Tout d'abord, vos méthodes doivent être statiques ou avoir self comme premier argument. Une fois cela corrigé, vous pouvez utiliser random.choice à la place pour choisir la méthode dans une liste. Cela a l'avantage de ne pas dépendre des noms des méthodes.

import random

class Calculate:
    @staticmethod
    def add(x, y):
        return x + y

    @staticmethod
    def sub(x, y):
        return x - y

    @staticmethod
    def mult(x, y):
        return x * y

    @staticmethod
    def div(x, y):
        return x/y

    @classmethod
    def random_op(cls, x, y):
        return random.choice([
            cls.add,
            cls.sub,
            cls.mult,
            cls.div
        ])(x, y)
0
Olivier Melançon 13 avril 2018 à 02:29

B est toujours une chaîne. Vous devez l'évaluer en une expression:

a = random.randint(1, 4)
b = 'HI_' + str(a)
func = eval("Calculate.{}".format(b))
func(15, 7)

Notez que vous ne devez pas utiliser eval() sur une chaîne qui est une entrée utilisateur car cela peut entraîner des failles de sécurité.

1
Primusa 13 avril 2018 à 01:59