C'est parfaitement possible, mais pas très significatif. Réfléchissez à la classe suivante :
class MyClass:
# Normal method:
def normal_method(self, data):
print "Normal method called with instance %s and data %s" % (self, data)
@classmethod
def class_method(cls, data):
print "Class method called with class %s and data %s" % (cls, data)
@staticmethod
def static_method(data):
print "Static method called with data %s" % (data)
Évidemment, nous pouvons appeler cela de la manière attendue :
>>> instance = MyClass()
>>> instance.normal_method("Success!")
Normal method called with instance <__main__.MyClass instance at 0xb7d26bcc> and data Success!
>>> instance.class_method("Success!")
Class method called with class __main__.MyClass and data Success!
>>> instance.static_method("Success!")
Static method called with data Success!
Mais considérez aussi ceci :
>>> MyClass.normal_method(instance, "Success!")
Normal method called with instance <__main__.MyClass instance at 0xb7d26bcc> and data Success!
La syntaxe instance.normal_method()
n'est qu'un "raccourci" pour l'option MyClass.normal_method(instance)
. C'est pourquoi il y a ce paramètre "self" dans les méthodes, pour passer dans le self. Le nom self n'est pas magique, vous pouvez l'appeler comme vous voulez.
La même astuce est parfaitement possible à partir d'une méthode statique. Vous pouvez appeler la méthode normale avec une instance comme premier paramètre, comme ceci :
@staticmethod
def a_cool_static_method(instance, data):
print "Cool method called with instance %s and data %s" % (instance, data)
MyClass.normal_method(instance, data)
MyClass.class_method(data)
MyClass.static_method(data)
>>> instance.a_cool_static_method(instance, "So Cool!")
Cool method called with instance <__main__.MyClass instance at 0xb7d26bcc> and data So Cool!
Normal method called with instance <__main__.MyClass instance at 0xb7d26bcc> and data So Cool!
Class method called with class __main__.MyClass and data So Cool!
Static method called with data So Cool!
La réponse est donc oui, vous pouvez caler des méthodes non-statiques à partir de méthodes statiques. Mais seulement si vous pouvez passer une instance comme premier paramètre. Vous devez donc soit la générer à l'intérieur de la méthode statique (et dans ce cas, il est probablement préférable d'utiliser une méthode de classe), soit la transmettre. Mais si vous transmettez l'instance, vous pouvez généralement en faire une méthode normale.
Alors tu peux, mais c'est plutôt inutile.
Et cela pose alors la question : Pourquoi le voulez-vous ?