2011-07-20 3 views
43

J'écris un programme Python pour le plaisir mais je me suis coincé en essayant d'importer une fonction d'une classe dans un autre fichier. Voici mon code:Importer une fonction d'une classe dans un autre fichier?

#jurassic park mainframe 

from random import randint 
from sys import exit 
from comm_system import Comm_system #the file i want to import from 



class Jpark_mainframe(object): 
    def mainframe_home(self): 
    print "=====Welcome to the Jurassic Park Mainframe=====" 
    print "==========Security Administration===============" 
    print "===========Communications Systems===============" 
    print "===============System Settings==================" 
    print "===================Quit=========================" 

    prompt = raw_input("What would you like to do? ") 

    while prompt != "Quit": 

     if prompt == "Security Administration": 
      print "Please enter the 5-digit passcode:" 
      security_passcode = "%d%d%d%d%d" % (2, 0, 1, 2, randint(1, 2)) 
      security_guess = raw_input(": ") 
      security_guesses = 0 

      while security_guess != security_passcode and security_guesses < 7: 
       print "Incorrect. Please enter the security passcode." 
       security_guesses += 1 
       security_guess = raw_input(": ") 

       if security_guess == security_passcode: 
        print "=========Security Administration=======" 
        print "Area 1 Fences: Off" 
        print "Area 2 Fences: On" 
        print "Area 3 Fences: Off" 
        print "Velociraptor Compound: Off" 
        print "Lobby Security System: Off" 
        print "Entrance Facility System: Off" 
        print "To enable all systems, enter 'On'" 


        enable_security = raw_input(": ") 

        if enable_security == "On": 
         print "Systems Online." 


     if prompt == "System Settings": 
      print "You do not have access to system settings." 
      exit(0) 


     if prompt == "Communications Systems": 
      print "===========Communications Systems===========" 
      print "error: 'comm_link' missing in directories" 
      exit(0) 
      return Comm_system.run #this is where I want to return the 
                #the other file 

the_game = jpark_mainframe() 
the_game.mainframe_home() 

Je veux retourner une fonction appelée run() d'une classe dans un autre fichier. Lorsque j'importe le fichier, il commence par exécuter la classe run(), puis exécute le code d'origine. Pourquoi cela arrive-t-il?

Voici le code de comm_system:

#communication systems 


from sys import exit 

class Comm_system(object): 
def run(self): 

    comm_directory = ["net_link", "tsfa_run", "j_link"] 
    print "When the system rebooted, some files necessary for" 
    print "communicating with the mainland got lost in the directory." 
    print "The files were poorly labeled as a result of sloppy" 
    print "programming on the staff's part. You must locate the" 
    print "the file and contact the rescue team before the dinosaurs" 
    print "surround the visitor's center. You were also notified the" 
    print "generators were shorting out, and the mainframe will lose" 
    print "power at any moment. Which directory will you search in?" 
    print "you don't have much time! Option 1: cd /comm_sys/file" 
    print "Option 2: cd /comm_sys/dis" 
    print "Option 3: cd /comm_sys/comm" 

    dir_choice = raw_input("jpark_edwin$ ") 

    if dir_choice == "/comm_sys/file" or dir_choice == "/comm_sys/dis": 
     print "misc.txt" 
     print "You couldn't locate the file!" 
     print "The system lost power and your computer shut down on you!" 
     print "You will not be able to reach the mainland until the system" 
     print "comes back online, and it will be too late by then." 
     return 'death' 

    if dir_choice == "/comm_sys/comm": 
     comm_directory.append("comm_link") 
     print comm_directory 
     print "You found the right file and activated it!" 
     print "Just in time too, because the computers shut down on you." 
     print "The phonelines are radios are still online." 
     print "You and the other survivors quickly call the mainlane" 
     print "and help is on the way. You all run to the roof and wait" 
     print "until the helocopter picks you up. You win!" 
a_game = Comm_system() 
a_game.run() 
+0

S'il vous plaît montrer ce qui est dans la autre fichier. Et avez-vous lu [this] (http://docs.python.org/tutorial/modules.html)? – jtbandes

+0

Cela ne devrait même pas analyser - votre indentation est fausse et même le boîtier diffère d'un endroit à l'autre. –

+0

Il fonctionne, j'ai ajouté quelques retraits par erreur lors de la copie de textmate. l'ai corrigé dans la dernière édition – Capkutay

Répondre

61
from otherfile import TheClass 
theclass = TheClass() 
# if you want to return the output of run 
return theclass.run() 
# if you want to return run itself to be used later 
return theclass.run 

Modifier la fin du système de comm à:

if __name__ == '__main__': 
    a_game = Comm_system() 
    a_game.run() 

Ce sont ces lignes étant toujours frais qui sont à l'origine à exécuter lorsque importé ainsi que lorsqu'il est exécuté.

+0

donc je dois mettre une instance de la classe dans le fichier original (jurassicpark mainframe)? en passant, je vais essayer ... – Capkutay

+0

en passant, s'il vous plaît excusez le sujet geek de ce programme, je ne pouvais pas vraiment penser à rien d'autre à faire – Capkutay

+0

Vérifiez ma modification - vous devez seulement faire le dernier deux lignes de votre module si c'est ce qui est en cours d'exécution directement. – agf

0

Il serait vraiment utile si vous incluez le code qui ne fonctionne pas (à partir de l '«autre» fichier), mais je soupçonne que vous pourriez faire ce que vous voulez avec une bonne dose de la fonction «eval».

Par exemple:

def run(): 
    print "this does nothing" 

def chooser(): 
    return "run" 

def main(): 
    '''works just like: 
    run()''' 
    eval(chooser())() 

Le chooser renvoie le nom de la fonction à exécuter, eval tourne alors une chaîne en code réel à exécuter en place, et les parenthèses Terminons l'appel de fonction.

+0

Vous avez une citation simple supplémentaire qui fait que votre programme a une erreur de syntaxe. Aussi, je ne pense pas qu'il ait besoin de 'eval' pour ce qu'il fait, probablement juste' getattr (module_or_class, chooser()) 'si vous interprétez correctement sa question. – agf

+0

Je peux penser à une demi-douzaine de façons de faire ce que je pense qu'il veut faire, certaines moins pythonesque que d'autres. Cependant 'eval' est brutalement facile à travailler avec parfois même très dangereux. C'est tout à fait possible, il a simplement besoin de retourner une instance d'une classe à un autre fichier et exécuter la fonction à partir de là comme vous l'avez suggéré. Plus de détails serait génial. – mikebabcock

2

Vous devez d'abord vous assurer que vos deux fichiers se trouvent dans le même répertoire de travail. Ensuite, vous pouvez importer le fichier entier. Par exemple,

import myClass 

ou vous pouvez importer la totalité de la classe et des fonctions entières à partir du fichier. Par exemple,

from myClass import 

Enfin, vous devez créer une instance de la classe à partir du fichier d'origine et appeler les objets d'instance.

4

Si, comme moi, vous voulez créer un pack de fonctions ou quelque chose que les utilisateurs peuvent télécharger, c'est très simple. Il suffit d'écrire votre fonction dans un fichier python et de l'enregistrer sous le nom que vous voulez dans votre répertoire Python. Maintenant, dans votre script où vous voulez utiliser, vous tapez:

from FILE NAME import FUNCTION NAME 

Remarque - les parties en majuscules sont où vous tapez le nom du fichier et le nom de la fonction.

Maintenant, vous utilisez simplement votre fonction, mais il était censé être.

Exemple:

FONCTION SCRIPT - enregistrée dans C: \ Python27 comme function_choose.py

def choose(a): 
    from random import randint 
    b = randint(0, len(a) - 1) 
    c = a[b] 
    return(c) 

SCRIPT FONCTION UTILISATION - enregistrée chaque fois que

from function_choose import choose 
list_a = ["dog", "cat", "chicken"] 
print(choose(list_a)) 

SORTIE SERA DOG, CAT, OU POULET

espériez cela a aidé, maintenant vous pouvez créer des packs de fonction pour le téléchargement!

-------------------------------- Ceci est pour Python 2.7 --------- ----------------------------

7
from FOLDER_NAME import FILENAME 
from FILENAME import CLASS_NAME FUNCTION_NAME 

NOMFICHIER w/o le suffixe

Questions connexes