2012-11-03 4 views
3

je suivant la classe simplifiée nommée Password.py dans folder1:Utilisation correcte des méthodes statiques

import random                  

CHARS = "ABC" 

class PasswordHelper(object):             
    @staticmethod                   
    def generateChars(length):              
     return ''.join(random.choice(CHARS) for x in range(length)) 

Maintenant, j'ai une autre classe TestClass.py dans folder2:

sys.path.append('../folder1/')        
import Password           

class Tester:           
    def whatever(self):         
     print Password.generateChars(3) 

def main(): 
    x = Tester() 
    x.whatever() 

# call main method 
main() 

Lorsque vous appelez python TestClass.py je reçois l'erreur suivante: AttributeError: l'objet 'module' n'a pas d'attribut 'generateChars'. Les deux dossiers sont au même niveau. Y a-t-il un problème avec la façon dont j'importe les fichiers de classe ou avec la déclaration de méthode statique elle-même?

Répondre

8

Python n'est pas Java.

Premièrement, il n'y a absolument aucun intérêt pour les classes Tester ou Password. Si vous ne stockez pas d'état, ne définissez pas de classe. Faites en sorte que whatever et generateChars deviennent des fonctions autonomes normales. Cependant, en supposant que vous le faites juste pour en savoir plus sur les classes Python, vous n'avez pas compris qu'une classe ne correspond pas à un module en Python. Étant donné que vous avez importé le module Password, vous avez encore besoin de se référer à la classe PasswordHelper:

Password.PasswordHelper.generateChars(3) 

Vous pouvez également importer la classe PasswordHelper:

from Password import PasswordHelper 
... 
PasswordHelper.generateChars(3) 

Enfin, s'il vous plaît suivre pep8 pour votre module , les noms de classe et de fonction.

+0

+1 NB même si vous avez un état, il peut être judicieux de passer cet état en argument et de renvoyer des valeurs. Mais c'est une question de goût, d'abord se débarrasser de l'état d'esprit "classes pour * tout *". – delnan

+0

Hmm. Bien. Je pensais sérieusement qu'avoir une classe pour tout était considéré comme un bon style. Je suppose que j'avais tort ... – cherrun

+0

En fait je me demande, pourquoi exactement c'est mauvais d'avoir des cours pour tout? Y a-t-il plus de lectures "plus profondes"? – cherrun

2

Vous avez défini la fonction dans une classe, vous devez donc faire référence avec le nom de classe aussi:

print Password.PasswordHelper.generateChars(3) 

Vous pouvez également déplacer la fonction sur de la définition de la classe, à quel point vous n'avez pas besoin utiliser @staticmethod du tout:

import random                  

CHARS = "ABC" 

def generateChars(length):              
    return ''.join(random.choice(CHARS) for x in range(length)) 

en Python, les fonctions ne pas ont à faire partie d'une définition de classe.

Questions connexes