web-dev-qa-db-fra.com

appeler une fonction de classe en python - de manière différente

EDIT2: Merci à tous pour votre aide! EDIT: en ajoutant @staticmethod, cela fonctionne. Cependant, je me demande toujours pourquoi je reçois une erreur de type ici. 

Je viens de commencer OOPS et je suis complètement nouveau dans ce domaine. J'ai une question très basique concernant les différentes manières dont je peux appeler une fonction d'une classe.

class MathsOperations:
    def __init__ (self, x, y):
        self.a = x
        self.b = y
    def testAddition (self):
        return (self.a + self.b)

    def testMultiplication (self):
        return (self.a * self.b)

J'appelle cette classe à partir d'un autre fichier appelé main.py avec le code suivant:

from testClass import MathsOperations

xyz = MathsOperations(2, 3)
print xyz.testAddition()

Cela fonctionne sans aucun problème. Cependant, je voulais utiliser le cours de manière beaucoup plus simple.

J'ai maintenant mis le code suivant dans le fichier testClass.py. J'ai abandonné la fonction init cette fois.

class MathsOperations:
    def testAddition (x, y):
        return x + y

    def testMultiplication (a, b):
        return a * b

appeler cela en utilisant;

from testClass import MathsOperations
xyz = MathsOperations()
print xyz.testAddition(2, 3)

ça ne marche pas. Quelqu'un peut-il expliquer ce qui se passe mal dans le cas 2? Comment utiliser cette classe?

L'erreur que j'obtiens est "TypeError: testAddition () prend exactement 2 arguments (3 donnés)"

9
Rishav Sharan

vous devez vous utiliser comme premiers paramètres d'une méthode

dans le second cas, vous devriez utiliser

class MathOperations:
    def testAddition (self,x, y):
        return x + y

    def testMultiplication (self,a, b):
        return a * b

et dans votre code, vous pouvez faire ce qui suit

tmp = MathOperations
print tmp.testAddition(2,3)

si vous utilisez la classe sans instancier une variable d'abord

print MathOperation.testAddtion(2,3)

cela vous donne une erreur "TypeError: méthode non liée"

si vous voulez faire cela, vous aurez besoin du @staticmethod decorator

Par exemple: 

class MathsOperations:
    @staticmethod
    def testAddition (x, y):
        return x + y

    @staticmethod
    def testMultiplication (a, b):
        return a * b

alors dans votre code, vous pouvez utiliser

print MathsOperations.testAddition(2,3)
18
Rafael Rotelok

disclaimer: ce n'est pas une réponse juste au point, mais plutôt un conseil, même si la réponse se trouve sur les références

IMHO: la programmation orientée objet en Python est très pénible.

La répartition des méthodes n’est pas très simple, vous devez connaître les méthodes liées/non liées d’instance/classe (et statique!); vous pouvez avoir plusieurs héritages et devoir gérer des classes de style héritées et nouvelles (votre style était ancien) et savoir comment fonctionne le MRO, les propriétés ... 

En bref: trop complexe, avec beaucoup de choses qui se passent sous le capot. Permettez-moi même de dire que cela n’est pas rythmique, car il existe de nombreuses façons différentes d’atteindre les mêmes objectifs.

Mon conseil: utilisez OOP uniquement lorsque c'est vraiment utile. Généralement, cela signifie écrire des classes qui implémentent des protocoles bien connus et s’intègrent de manière transparente au reste du système. Ne créez pas beaucoup de classes uniquement pour écrire du code orienté objet.

Bonne lecture de ces pages:

vous les trouverez très utiles.

Si vous voulez vraiment apprendre la POO, je vous conseillerais de commencer par un langage plus conventionnel, tel que Java. Ce n'est pas aussi amusant que Python, mais c'est plus prévisible.

8
fortran

Vos méthodes ne font pas référence à un objet (c'est-à-dire à soi-même), vous devriez donc Utiliser le @staticmethod decorator :

class MathsOperations:
    @staticmethod
    def testAddition (x, y):
        return x + y

    @staticmethod
    def testMultiplication (a, b):
        return a * b
2
Owen

Vous devez avoir une instance d'une classe pour utiliser ses méthodes. Ou bien si vous n'avez pas besoin d'accéder aux variables des classes (pas aux paramètres statiques), vous pouvez définir la méthode comme statique et l'utiliser même si la classe n'est pas instanciée. Ajoutez simplement @staticmethod décorateur à vos méthodes.

class MathsOperations:
    @staticmethod
    def testAddition (x, y):
        return x + y
    @staticmethod
    def testMultiplication (a, b):
        return a * b

docs: http://docs.python.org/library/functions.html#staticmethod

1
rplnt
class MathsOperations:
    def __init__ (self, x, y):
        self.a = x
        self.b = y
    def testAddition (self):
        return (self.a + self.b)

    def testMultiplication (self):
        return (self.a * self.b)

puis

temp = MathsOperations()
print(temp.testAddition())
0
Ali Hajiloo