web-dev-qa-db-fra.com

Appel de la méthode statique dans python

J'ai une classe Person et une méthode statique dans cette classe appelée call_person:

class Person:
    def call_person():
        print "hello person"

Dans la console python), j'importe la classe Person et appelle Person.call_person(). Mais cela me donne une erreur indiquant 'module' object has no attribute 'call_person'. Quelqu'un peut-il me dire pourquoi Je reçois cette erreur?

49
Sadiksha Gautam

Vous devez faire quelque chose comme:

class Person(object): #always inherit from object.  It's just a good idea...
    @staticmethod
    def call_person():
        print "hello person"

#Calling static methods works on classes as well as instances of that class
Person.call_person()  #calling on class
p = Person()
p.call_person()       #calling on instance of class

Selon ce que vous voulez faire, une méthode de classe peut être plus appropriée:

class Person(object):
    @classmethod
    def call_person(cls):
        print "hello person",cls

p = Person().call_person() #using classmethod on instance
Person.call_person()       #using classmethod on class

La différence ici est que, dans le deuxième exemple, la classe elle-même est passée en tant que premier argument de la méthode (par opposition à une méthode régulière où l'instance est le premier argument ou une méthode statique qui ne reçoit aucun argument supplémentaire).

Maintenant, répondez à votre question. Je parie que vous ne trouvez pas votre méthode car vous avez mis la classe Person dans un module Person.py.

Ensuite:

import Person  #Person class is available as Person.Person
Person.Person.call_person() #this should work
Person.Person().call_person() #this should work as well

Vous pouvez également importer la classe Person du module Person:

from Person import Person
Person.call_person()

Tout cela devient un peu déroutant quant à ce qui est un module et ce qui est une classe. En règle générale, j'essaie d'éviter de donner aux classes le même nom que le module dans lequel elles habitent. Cependant, ce module n'est apparemment pas trop méprisé, car le module datetime de la bibliothèque standard contient un datetime classe.

Enfin, il est intéressant de noter que vous n'avez pas besoin une classe pour cet exemple simple:

#Person.py
def call_person():
    print "Hello person"

Maintenant, dans un autre fichier, importez-le:

import Person
Person.call_person() #'Hello person'
110
mgilson

Tout le monde a déjà expliqué pourquoi il ne s'agissait pas d'une méthode statique, mais j'expliquerai pourquoi vous ne la trouvez pas. Vous recherchez la méthode dans le module et non dans la classe afin que quelque chose comme celle-ci le trouve correctement.

import person_module
person_module.Person.call_person() # Accessing the class from the module and then calling the method

De plus, comme @DanielRoseman l'a dit, vous auriez peut-être imaginé que les modules contiennent une classe portant le même nom, comme Java bien que ce ne soit pas le cas en Python.

14
jamylak

Ce n'est pas une méthode statique; essayer

class Person:
    @staticmethod
    def call_person():
        print "hello person"

Voir ici pour plus d'informations.

4

Dans python 3.x, vous pouvez déclarer une méthode statique comme suit:

class Person:
    def call_person():
        print "hello person"

mais la méthode avec le premier paramètre comme auto sera traitée comme une méthode de classe

def call_person (self): affiche "bonjour personne"

mais dans python 2.x, vous devez utiliser un '@staticmethod' avant la méthode statique

class Person:
    @staticmethod
    def call_person():
        print "hello person"

vous pouvez aussi déclarer une méthode statique comme ceci

class Person:
    @staticmethod
    def call_person(self):
        print "hello person"
3
shijq73
0
Pran