Mise à jour : je viens de voir la référence à call_user_func_array
dans votre poste. c'est différent. utilisez getattr
pour obtenir l'objet fonction et ensuite l'appeler avec vos arguments
class A(object):
def method1(self, a, b, c):
# foo
method = A.method1
method
est maintenant un objet fonction réel que vous pouvez appeler directement (les fonctions sont des objets de première classe en python, tout comme en PHP > 5.3). Mais les considérations ci-dessous s'appliquent toujours. En d'autres termes, l'exemple ci-dessus explosera à moins que vous ne décoriez A.method1
avec l'un des deux décorateurs présentés ci-dessous, passez-lui une instance de A
comme premier argument ou accéder à la méthode sur une instance de A
.
a = A()
method = a.method1
method(1, 2)
Vous avez trois possibilités pour ce faire
- Utilisez une instance de
A
d'appeler method1
(en utilisant deux formes possibles)
- appliquer le
classmethod
au décorateur method1
: vous ne pourrez plus faire référence self
en method1
mais on vous fera passer un cls
à sa place, qui est A
dans ce cas.
- appliquer le
staticmethod
au décorateur method1
: vous ne pourrez plus faire référence self
o cls
en staticmethod1
mais vous pouvez coder en dur les références à A
dans celui-ci, bien qu'évidemment, ces références seront héritées par toutes les sous-classes de A
à moins qu'ils ne remplacent spécifiquement method1
et ne pas appeler super
.
Quelques exemples :
class Test1(object): # always inherit from object in 2.x. it's called new-style classes. look it up
def method1(self, a, b):
return a + b
@staticmethod
def method2(a, b):
return a + b
@classmethod
def method3(cls, a, b):
return cls.method2(a, b)
t = Test1() # same as doing it in another class
Test1.method1(t, 1, 2) #form one of calling a method on an instance
t.method1(1, 2) # form two (the common one) essentially reduces to form one
Test1.method2(1, 2) #the static method can be called with just arguments
t.method2(1, 2) # on an instance or the class
Test1.method3(1, 2) # ditto for the class method. It will have access to the class
t.method3(1, 2) # that it's called on (the subclass if called on a subclass)
# but will not have access to the instance it's called on
# (if it is called on an instance)
Notez que de la même manière que le nom de l'élément self
est entièrement à votre discrétion, tout comme le nom de la variable cls
variable mais ce sont les valeurs habituelles.
Maintenant que tu sais comment faire, je penserais sérieusement à if vous voulez le faire. Souvent, les méthodes qui sont destinées à être appelées de manière non liée (sans instance) doivent être considérées comme des fonctions de niveau module dans Python.
2 votes
Faut-il vraiment que ce soit une méthode de classe et non une fonction ? Les méthodes statiques dans d'autres langages ne correspondent pas nécessairement à une méthode de classe en Python. Lisez ceci : dirtsimple.org/2004/12/python-n'est-pas-java.html
23 votes
@Ivo Honnêtement, qu'est-ce que ça peut vous faire s'il écrit son propre MVC avant d'avoir appris les bases ? laissez-le essayer et apprendre les bases dans le processus. Arrêtez d'être aussi condescendant envers les gens qui posent des questions.
0 votes
Peut-être dupliqué à stackoverflow.com/questions/3311987/