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?
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'
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.
Ce n'est pas une méthode statique; essayer
class Person:
@staticmethod
def call_person():
print "hello person"
Voir ici pour plus d'informations.
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"
Vous devez ajouter la méthode de classe de décorateur .