2009-10-09 9 views
0

J'écris un programme qui assemble de façon aléatoire des expressions mathématiques en utilisant les valeurs stockées dans cette classe. Les opérateurs sont stockés dans un dictionnaire avec le nombre d'arguments dont ils ont besoin. Les arguements sont stockés dans une liste. (les quatre x s'assurent que la variable x est choisie souvent) profondeur, le ratio, la méthode et l'énigme sont d'autres valeurs nécessaires. Je les ai mis dans une classe afin qu'ils soient dans un endroit, où je peux aller les changer. Est-ce la meilleure façon de faire cela? Il semble que je ne peux pas les désigner par Params.depth. Cela produit l'erreur 'Params n'a pas de profondeur' attribut '. Je dois créer une instance de Params() (p = Params()) et y faire référence par p.depth.Enregistrer des paramètres dans une classe et comment y accéder

Je suis nouveau pour Python. Merci

class Params(object): 
    def __init__(self): 
     object.__init__(self) 
     self.atoms =['1.0','2.0','3.0','4.0','5.0','6.0','7.0','8.0','9.0','x','x','x','x'] 
     self.operators = {'+': 2, '-': 2, '*': 2, '/': 2,'+': 2, '-': 2, '*': 2, '/': 2, '**': 2, '%': 2} 
     self.depth = 1 
     self.ratio = .4 
     self.method = '' 
     self.riddle = '1 + np.sin(x)' 
+0

Je suppose que je vais cogner ici et dire que 'object .__ init__' ne fait rien. – Triptych

+0

J'ai appris plus des deux réponses. Je vais accepter Triptych. merci –

Répondre

7

Ce que vous avez là sont des propriétés d'objet. Vous voulez utiliser des variables de classe:

class Params(object): 
    atoms =['1.0','2.0','3.0','4.0','5.0','6.0','7.0','8.0','9.0','x','x','x','x'] 
    operators = {'+': 2, '-': 2, '*': 2, '/': 2,'+': 2, '-': 2, '*': 2, '/': 2, '**': 2, '%': 2} 
    depth = 1 
    ratio = .4 
    method = '' 
    riddle = '1 + np.sin(x)' 

# This works fine: 
Params.riddle 

Il est assez commun en Python pour ce faire, puisque tout le monde à peu près d'accord que Params.riddle est beaucoup plus agréable à taper que Params['riddle']. Si vous vous trouvez beaucoup à faire cela, vous pouvez utiliser this recipe ce qui rend les choses un peu plus faciles et beaucoup plus claires sémantiquement.

Attention: si cette classe Params est trop grand, un plus, Grumpier Pythonista peut apparaître et vous dire de déplacer simplement toutes ces conneries dans son propre module.

0

Vous pouvez le faire dans une classe, mais je préfère le mettre dans un dictionnaire. Les dictionnaires sont le type de conteneur polyvalent en Python, et ils sont parfaits pour ce genre de choses.

params = { 
    atoms: ['1.0','2.0','3.0','4.0','5.0','6.0','7.0','8.0','9.0','x','x','x','x'], 
    operators: {'+': 2, '-': 2, '*': 2, '/': 2,'+': 2, '-': 2, '*': 2, '/': 2, '**': 2, '%': 2}, 
    depth: 1, 
    ratio: .4, 
    method: '', 
    riddle = '1 + np.sin(x)' 
} 

Maintenant vous pouvez faire params['depth'] ou params['atoms'][2]. Certes, c'est un peu plus verbeux que la forme de l'objet, mais personnellement je pense que ça vaut le coup d'éviter de polluer l'espace de noms avec des définitions de classe inutiles.

+0

Vous «polluez l'espace de noms» avec exactement le même nombre de nouveaux noms globaux: 1. – Triptych

Questions connexes