2011-07-20 10 views
43

Estoy escribiendo un programa de Python por diversión pero me atasqué al tratar de importar una función de una clase en otro archivo. Aquí está mi código:Importación de una función de una clase en otro archivo?

#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() 

quiero devolver una función llamada run() de una clase en otro archivo. Cuando importo el archivo, primero ejecuta la clase con run() y luego ejecuta el código original. ¿Por qué pasó esto?

Aquí está el código 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

por favor, muestran lo que hay en el otro archivo. ¿Y has leído [esto] (http://docs.python.org/tutorial/modules.html)? – jtbandes

+0

Esto ni siquiera debería analizar: su sangría es incorrecta e incluso la carcasa difiere de un lugar a otro. –

+0

Se ejecuta, agregué un par de sangrías por error al copiar de un compañero de texto. lo arreglé en la última edición – Capkutay

Respuesta

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 

cambiar el final de sistema de comunicaciones a:

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

son esas líneas de estar siempre de ejecución que están haciendo que se ejecute cuando importado así como cuando se ejecuta.

+0

así que tengo que poner una instancia de la clase en el archivo original (jurassicpark mainframe)? lo tengo, lo intentaré ... – Capkutay

+0

por cierto, discúlpeme por el tema obsceno de este programa, realmente no podría pensar en otra cosa que hacer – Capkutay

+0

Eche un vistazo a mi edición - solo necesita hacer la última dos líneas de tu módulo si es lo que se está ejecutando directamente. – agf

0

Realmente sería útil incluir el código que no funciona (del "otro" archivo), pero sospecho que podría hacer lo que quiera con una buena dosis de la función "eval".

Por ejemplo:

def run(): 
    print "this does nothing" 

def chooser(): 
    return "run" 

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

El selector devuelve el nombre de la función a ejecutar, eval luego se vuelve una cadena en código real que se ejecutará en el lugar, y los paréntesis rematar la llamada a la función.

+0

Tiene una comilla simple adicional que hace que su programa tenga un error de sintaxis. Además, no creo que necesite 'eval' para lo que está haciendo, probablemente solo' getattr (module_or_class, Chooser()) 'si estás interpretando su pregunta correctamente. – agf

+0

Puedo pensar en media docena de formas de hacer lo que creo que quiere hacer, algunas menos pitonescas que otras. Sin embargo, 'eval' es brutalmente fácil de usar, aunque a veces muy peligroso. Es muy posible que simplemente necesite devolver una instancia de una clase a otro archivo y ejecutar la función desde allí como sugirió. Más detalles sería genial. – mikebabcock

2

Primero debe asegurarse de que sus dos archivos estén en el mismo directorio de trabajo. A continuación, puede importar todo el archivo. Por ejemplo,

import myClass 

o puede importar toda la clase y funciones enteras del archivo. Por ejemplo,

from myClass import 

Por último, es necesario crear una instancia de la clase desde el archivo original y llamar a los objetos de instancia.

4

Si, como yo, quieres crear un paquete de funciones o algo que la gente pueda descargar, entonces es muy simple. Simplemente escriba su función en un archivo python y guárdelo como el nombre que desea EN SU DIRECTORIO PYTHON. Ahora, en la secuencia de comandos en la que desea utilizar esto, se escribe:

from FILE NAME import FUNCTION NAME 

Nota - las partes en letras mayúsculas son donde se escribe el nombre del archivo y el nombre de la función.

Ahora solo tiene que usar su función como debe ser.

Ejemplo:

función de script - guardado en C: \ python27 como function_choose.py

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

script utilizando FUNCIÓN - grabarse en cualquier sitio

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

salida será perro, gato, pollo o

espera que esto ayudó, ahora puede crear paquetes de función para descargar!

-------------------------------- Esto es para Python 2.7 --------- ----------------------------

7
from FOLDER_NAME import FILENAME 
from FILENAME import CLASS_NAME FUNCTION_NAME 

FILENAME es w/o el sufijo

Cuestiones relacionadas