2010-07-25 9 views
3

Ma question est comment utiliser les attributs de données dans une méthode, mais permettez-leur d'être surchargé individuellement lors de l'appel de la méthode. Cet exemple montre comment j'ai essayé de le faire:Python: comment remplacer les attributs de données dans les appels de méthode?

class Class: 
    def __init__(self): 
     self.red = 1 
     self.blue = 2 
     self.yellow = 3 
    def calculate(self, red=self.red, blue=self.blue, yellow=self.yellow): 
     return red + blue + yellow 

C = Class 
print C.calculate() 
print C.calculate(red=4) 

-t-il est logique ce que je suis en train d'accomplir? Lorsque la fonction calculate est appelée, je veux utiliser les attributs de données pour le rouge, le bleu et le jaune par défaut. Mais si l'appel de méthode spécifie explicitement un paramètre différent (rouge = 4), je veux qu'il utilise cette valeur spécifiée à la place. Quand je lance ceci, ça donne une erreur pour utiliser 'self'. dans le champ des paramètres (en disant que ce n'est pas défini). Y a-t-il un moyen de faire ce travail? Merci.

Répondre

4

Vous ne pouvez pas vous référer à self car il n'en est pas encore là.

La façon idiomatiques est de le faire à la place:

def calculate(self, red=None, blue=None, yellow=None): 
    if red is None: 
     red = self.red 
    if blue is None: 
     blue = self.blue 
    if yellow is None: 
     yellow = self.yellow 
    return red + blue + yellow 

« idiomatiques », hélas, ne signifie pas toujours « gentil, concis et Pythonic ».

Edit: cela ne fait pas mieux, il ne ...

def calculate(self, red=None, blue=None, yellow=None): 
    red, blue, yellow = map(
     lambda (a, m): m if a is None else a, 
     zip([red, blue, yellow], [self.red, self.blue, self.yellow])) 
    return red + blue + yellow 
+0

Comme vous l'avez dit, pas aussi concis que l'on voudrait - mais certainement réparable. Merci beaucoup! – Elliott

+0

Ensuite, appuyez sur la coche verte;) – Thomas

0

Vous pouvez l'écrire dans les lignes moins:

def calculate(self, red=None, blue=None, yellow=None): 
    red = self.red if red is None else red 
    blue = self.blue if blue is None else blue 
    yellow = self.yellow if yellow is None else yellow 
    return red + blue + yellow 
+0

Si les couleurs peuvent être 0 (ce qui peut probablement), la première approche échoue. La seconde est d'accord. – Thomas

+0

C'est vrai. Merci de l'avoir signalé :-) – gruszczy

1

Une autre option serait d'utiliser ** kwargs et un attribut de classe:

class Calc: 
    defaults = { 
     'red': 1, 'blue': 2, 'yellow': 3 
     } 
    def __init__(self, **kwargs): 
    self.__dict__.update(self.defaults) 
    self.__dict__.update(kwargs) 
Questions connexes