2015-03-29 1 views
1

Est-il possible d'avoir une fonction qui se comporte comme une fonction @staticmethod mais aussi comme n'importe quelle autre fonction de sorte que si on appelle la fonction via une instance, les données de l'instance peuvent être passées?Fonction de classe et méthode statique en même temps? (Python)

exemple:

class Amazing(object): 
    @static_and_class 
    def func(x): 
     return type(x) 

apple = Amazing() 

>>> print(apple.func()) 
>>> <class 'Amazing'> 
>>> print(Amazing.func(2)) 
>>> <class 'int'> 

C'est un exemple de base du système. Fondamentalement, ce que je veux, c'est un moyen de transmettre des informations comme des données d'instance si possible, mais si les données n'étaient pas là, la fonction prendrait les variables nécessaires pour exécuter son programme.

Merci à tous ceux qui peuvent résoudre ce problème !!

+0

Il n'y a pas de fonction intégrée pour cela, mais vous pouvez facilement écrire un tel décorateur. –

Répondre

1

Toute méthode de n'importe quelle classe peut être appelée par le nom de la classe. Une instance se passera automatiquement comme le premier paramètre de l'une de ses méthodes. Donc, si vous avez quelque chose comme

class Bar: 
    def bar(self): 
     return type(self) 

vous pouvez faire

thing = Bar() 
print(thing.bar()) 
print(Bar.bar(2)) 

et vous obtiendrez

<class '__main__.Bar'> 
<class 'int'> 

sans problème. Ceci est, bien sûr, désapprouvé; lors de l'écriture des méthodes pour les instances, la méthode doit être écrite de telle sorte que self soit présumé être une instance de la classe pour laquelle elle est écrite.

+1

Eh bien, c'est seulement vrai pour Python 3 où ils ont enlevé le concept de méthodes non liées. –

+0

mais mon code a des parties comme self.foo où un argument self ne fonctionnerait pas pour les non-instances –

+0

Vous pouvez utiliser la vérification de type pour prendre soin de cela, si vous le souhaitez; diviser le comportement selon que l'argument est ou non une instance de la classe. – Sidnoea