2010-05-07 3 views
5

Je veux passer la méthode de classe et un argument par défaut à une autre méthode de classe, afin que je puisse réutiliser la méthode comme @classmethod:Puis-je passer la méthode de classe et un argument par défaut à une autre méthode de classe

@classmethod 
class foo: 
    def func1(self,x): 
     do somthing; 
    def func2(self, aFunc = self.func1): 
     # make some a call to afunc 
     afunc(4) 

C'est pourquoi lorsque la méthode func2 est appelée dans la classe aFunc est self.func1 par défaut, mais je peux appeler cette même fonction de l'extérieur de la classe et lui passer une fonction différente à l'entrée.

je reçois:

NameError: name 'self' is not defined

Voici ma configuration:

class transmissionLine: 
    def electricalLength(self, l=l0, f=f0, gamma=self.propagationConstant, deg=False): 

Mais je veux être en mesure d'appeler electricalLength avec une autre fonction pour le gamma, comme:

transmissionLine().electricalLength (l, f, gamma=otherFunc) 
+0

Voir http://stackoverflow.com/questions/3083692/using-class-static-methods-as-default-parameter-values-within-methods-of-the-same pour une excellente solution dans un situation quelque peu similaire. – max

Répondre

9

Les valeurs d'argument par défaut sont calculées pendant la définition de la fonction, pas pendant l'appel de la fonction. Donc non, vous ne pouvez pas. Vous pouvez faire ce qui suit, cependant:

def func2(self, aFunc = None): 
    if aFunc is None: 
     aFunc = self.func1 
    ... 
+0

Je ne sais vraiment pas si je comprends parfaitement la question qu'il pose, mais vous avez certainement identifié la cause de l'erreur qu'il voit. –

1

Vous devriez écrire comme ceci:

class Foo(object): 
    @classmethod 
    def func1(cls, x): 
     print x 
    def func2(self, afunc=None): 
     if afunc is None: 
      afunc = self.func1 
     afunc(4) 

Bien qu'il serait utile si vous avez donné un peu plus d'informations sur ce que vous essayez de faire. Il y a probablement un moyen plus élégant de le faire sans classmethods.

+0

@alex - ce qui précède est difficile à lire dans un commentaire. Editez votre question et ajoutez-la –

1

La façon dont vous essayez ne fonctionnera pas, car Foo n'est pas encore défini.

class Foo: 
    @classmethod 
    def func1(cls, x): 
    print 'something: ', cls, x 

def func2(cls, a_func=Foo.func1): 
a_func('test') 

Foo.func2 = classmethod(func2) 

Foo.func2() 
+1

Hey je sais que ce n'est pas vraiment une solution pythonienne cool, mais la question était "puis-je passer la méthode de classe et un argument par défaut à une autre méthode de classe", et oui vous pourriez. – evilpie

+0

Vous passez une fonction, pas une liaison de méthode ici. La liaison de méthode inclut déjà le premier argument (dans ce cas, c'est 'cls'), mais pas la fonction. Essayez d'utiliser votre suggestion et vous verrez que l'appel à 'a_func' ne fonctionnera pas car il n'y a pas assez d'arguments. – doublep

+1

Je ne vois pas pourquoi cela a été downvoted. Cela me semble viable. doublep est faux, le code s'exécute dans Python 2.6 comme écrit. –

Questions connexes